引用计数
Objective-C语言使用引用计数来管理内存,也就是说,每个对象都有个可以递增或递减的计数器。如果想使某个对象继续存活,那就递增其引用计数;用完之后,就递减其计数。计数变为0时,就表示没有人在继续关注该对象了,于是就可以把它销毁。(iOS从未支持过垃圾回收机制)
内存管理原则
- 自己生成的对象,自己持有(alloc/new/copy/mutableCopy)
- 非自己生成的对象,自己也能持有(retain)
- 不在需要自己持有的对象时释放(release)
- 非自己持有的对象不能释放
自己生成的对象,自己持有
使用alloc、new、copy、mutableCopy开头的方法名,意味着自己生成的对象自己持有。
id obj = [[NSObject alloc] init];
id obj = [NSObject new];
复制代码
非自己生成的对象,自己也能持有
使用上面方法之外的方法取得的对象,为非自己生成的对象,所以自己也不是该对象的持有者。可以使用retain方法持有非自己生成的对象。
id obj = [NSMutableArray array]; // 取得的对象存在,但自己不持有对象
[obj retain]; // 自己持有对象
复制代码
不在需要自己持有的对象时释放
自己持有的对象,不在需要时,持有者有义务释放该对象。使用release方法释放对象。当对象的引用计数为0时,则该对象被销毁(dealloc)。
id obj = [[NSObject alloc] init];
[obj release];
id obj = [NSMutableArray array];
[obj retain];
[obj release];
复制代码
注意:对象被释放后,不可再被访问
无法释放非自己持有的对象
在应用程序中,释放非自己持有的对象会造成崩溃。
id obj = [[NSObject alloc] init];
[obj release];
[obj release];
id obj = [NSMutableArray array];
[obj release]
//这两种情况都是释放了非自己持有的对象,都会导致应用程序崩溃
复制代码
这些关于Objective-C的内存管理方法,实际上不包括在该语言中,而是包含在Cocoa框架中。Cocoa框架中的Foundation框架中的NSObject类担负了内存管理职责。上述提到的alloc/retain/release/dealloc等方法都是NSObject类提供的方法。