《Objective-C高级编程iOS与OS X多线程和内存管理》之内存管理篇

内存管理篇的核心思路:
(1)自己生成的对象,自己持有。
(2)非自己生成的对象,自己也可以持有。
(3)不再需要自己持有的对象,释放之。
(4)非自己持有的对象无法释放。

“取得”,“持有”,“释放”,“废弃”是关键字眼,含义不同。
“取得”关键字眼只会出现在(2)中的情况。

Numbers制表

*注:以下代码运行在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];这条语句不会被执行。对对象的引用计数自然也不会有影响

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容