内存管理篇的核心思路:
(1)自己生成的对象,自己持有。
(2)非自己生成的对象,自己也可以持有。
(3)不再需要自己持有的对象,释放之。
(4)非自己持有的对象无法释放。
“取得”,“持有”,“释放”,“废弃”是关键字眼,含义不同。
“取得”关键字眼只会出现在(2)中的情况。
*注:以下代码运行在MRC环境
</br>
1、自己生成的对象,自己持有:
id obj = [[NSObject alloc] init];
或
id obj = [NSObject new];
二者完全等价。obj“持有”生成的对象。
2、非自己生成的对象,自己也可以持有
(实现步骤是——先“取得”,再“持有”):
使用alloc/new/copy/mutableCopy等以外的方法取得的对象就是这种情况。经常使用也很典型的一个方法是NSMutableArray的array类方法:
id obj = [NSMutableArray array]; //此时取得对象,但不是由obj持有该对象
[obj retain]; //此时obj持有对象
使用array类方法取得的对象,obj只是“取得”,并不“持有”。
obj调用retain方法才真正“持有”该对象。
那么在obj的“取得”阶段,到底是谁“持有”的呢?暂时是个未知数。也许有个神秘人“持有”,也许没人“持有”。
3、不再需要自己持有的对象,释放:
id obj = [[NSObject alloc] init]; //持有对象
[obj release]; //释放对象
或
id obj = [NSMutableArray array]; //取得对象
[obj retain]; //持有对象
[obj release]; //释放对象
4、非自己持有的对象无法释放:
id obj = [[NSObject alloc] init]; //持有对象
[obj release]; //释放对象
[obj release]; //过渡释放,崩溃
id obj = [NSMutableArray array]; //取得对象
[obj release]; //释放自己不持有的对象
备注:上一条代码运行在Xcode8.1中不会崩溃,可能编译器进行了优化处理,[obj release];这条语句不会被执行。对对象的引用计数自然也不会有影响
网友评论