Objective-C语言使用引用计数来管理内存,也就是说,每一个对象都有个能够递增或递减的计数器。若是想使某个对象继续存活,那就递增其引用计数;用完以后,就递减其计数。计数变为0时,就表示没有人在继续关注该对象了,因而就能够把它销毁。(iOS从未支持过垃圾回收机制)bash
使用alloc、new、copy、mutableCopy开头的方法名,意味着本身生成的对象本身持有。框架
id obj = [[NSObject alloc] init];
id obj = [NSObject new];
复制代码
使用上面方法以外的方法取得的对象,为非本身生成的对象,因此本身也不是该对象的持有者。能够使用retain方法持有非本身生成的对象。学习
id obj = [NSMutableArray array]; // 取得的对象存在,但本身不持有对象
[obj retain]; // 本身持有对象
复制代码
本身持有的对象,不在须要时,持有者有义务释放该对象。使用release方法释放对象。当对象的引用计数为0时,则该对象被销毁(dealloc)。spa
id obj = [[NSObject alloc] init];
[obj release];
id obj = [NSMutableArray array];
[obj retain];
[obj release];
复制代码
注意:对象被释放后,不可再被访问code
在应用程序中,释放非本身持有的对象会形成崩溃。cdn
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类提供的方法。对象
欢迎关注iOS学习社区公众号,学习更多iOS知识,iOS工做交流。blog