内存管理篇: 6.不要使用静态和动态数组(非OC集合对象)
静态数组(类似于c数组,非OC的集合对象):
- 使用strong、weak和__autoreleasing修饰的静态数组(如:id objs[10]),其初始值也会自动赋值为nil,且当其释放时,子元素也会自动被释放;
技术的,瞎说的,啥都有吧。。。希望。。。
我们都知道,在内存管理的思考方式中,当方法命名以“alloc、new、copy、mutableCopy”开头或直接命名时,返回对象(必须返回对象)的内存由接收方进行管理。这种方式在ARC中同样适用。
在ARC环境下,以init或init开头的方法,也需要遵循此规则。且init的方法规定更为严格:
more >>
- 在ARC下,对象必须通过所有权修饰符进行修饰,系统会根据不同的所有权修饰符对对象进行相应的内存管理。
- 所有权修饰符包括:strong、weak、unsafe_unretained、autoreleasing。
more >>autorelease的实质:
将创建的对象加入到NSAutoreleasePool管理“数组”中,并告知ARC系统暂时不要对此对象进行处理。待pool对象在其所属的NSRunLoop循环一次完成,准备释放(drain)时,对“数组”中的所有对象依次调用release方法。此时ARC再对对象进行内存管理。
GNUstep的版本将引用计数与对象的内存组合在一起,方便读写存取。
如图所示,使用了一个objc_layout结构体来表示引用计数,其大体结构及alloc的简化代码为:
more >>支持条件:
- clang(LLVM编译器)3.0版本以上
- objc4 OC运行时库 493.9版本以上
- 编译器设置中置为“ARC有效”
- Xcode 4.2版本以上
由于OC中的方法天生就是public的(就算只写到.m中,在运行时也可以调用到。。。),平时使用的单例方法也未必严谨,所以,看了书,受教了~(还好一般老老实实使用类方法创建单例的无所谓)。
一般来说,提供一个类方法入口,使用dispatch_once_t保护,使用静态类变量保存,即可成功一个创建线程安全的单例对象。
但是,当调用者在不知情的情况下,调用传统的二段式创建、new或者allocWithZone方法分配内存,甚至是调用copy或multableCopy方法时,都可以创建新的实例对象。所以,为了避免,就需要我们对这些方法依次堵住,重写时,直接在方法内部调用单例方法即可。并且,单例方法的实例化对象时,使用[[super allocWithZone:nil] init]来替代默认(自身的方法已经被重写了)。即可得到“严谨”的单例类。
平时都不这么用啊。。。确实是。。。不过既然书中提到了,也查阅了一下,说一说哇。。。(当前的示例代码中无法实现此功能)
书中说,使用NSAllocateObject()函数手动分配内存,可以实现子类创建自己的单例对象,但是由于现在是ARC环境,此函数早已不可用,需要对单例类单独“-fno-objc-arc”来开后门才行。另一篇博文IOS单例模式下多线程和继承写法总结里面,也有讨论过,通过查找源码的方式(alloc -> allocWithZone: -> class_createInstance() 的过程),直接使用runtime中的创建实例方法也能达到同样的效果(前提也是MRC环境下),d=====( ̄▽ ̄*)b厉害。
所以,平时不这么用。。。
示例代码地址:Singleton
缺失模块。
1、请确保node版本大于6.2
2、在博客根目录(注意不是yilia根目录)执行以下命令:
npm i hexo-generator-json-content --save
3、在根目录_config.yml里添加配置:
jsonContent: meta: false pages: false posts: title: true date: true path: true text: false raw: false content: false slug: false updated: false comments: false link: false permalink: false excerpt: false categories: false tags: true