本系列知识点均来自 《Objective-C 高级编程 IOS与OS X多线程和内存管理》,仅作重要知识点摘录。
引用计数式的内存管理方式:
- 自己生成的对象,自己所持有。(alloc/new/copy/mutableCopy)
- id obj = [[NSObject alloc] init];
- 非自己生成的对象,自己也能持有。(retain)
- id obj = [NSMutableArray array];
- 使用[NSMutableArray array]方法取得对象的存在,但自己不持有对象,实现原理如下:
- ... id obj = [[NSObject alloc] init];//自己持有对象
- [obj autorelease]; //取得对象的存在,但自己不持有对象
- return obj;
- autorelease:对象超出指定生存范围时能够自动并正确地释放。(注册到autoreleasepool中-> pool 结束时自动调用release)。
- 使用[NSMutableArray array]方法取得对象的存在,但自己不持有对象,实现原理如下:
- [obj retain];
- id obj = [NSMutableArray array];
- 不再需要自己持有的对象时释放。自己持有的对象,一旦不再需要,持有者有义务释放该对象。(release)
- id obj = [[NSObject alloc] init];
- [obj release];
- 非自己持有的对象无法是伐。 (deadlloc)
引用计数式的实现:
- 在Objective-C的对象中存在有引用计数这一整数数值。
- 调用alloc/retain 方法后,引用计数器加1。
- 调用release后,引用计数器减1。
- 引用计数值为0时,调用dealloc方法废弃对象。
- 苹果大概采用散列表(引用计数表)来管理引用计数。
autorelease:
- 看上去很像ARC,但实际上它更类似于C语言中的局部变量的特性。
在Cocoa 框架中,相当于程序主循环的NSRunLoop或者其他程序可运行的地方,对NSAutoreleasePool对象进行生成、持有和废弃处理。因此,应用程序开发者不一定非得使用NSAutoreleasePool对象来进行开发工作。
但在大量产生autorelease 对象时,只要不废弃NSAutoreleasePool对象,那么生成的对象就不能被释放,因此会产生内存不足问题。在此情况下,有必要在适当的地方生成、持有或废弃NSAutoreleasePool对象。