美文网首页
《Objective-C高级编程iOS与OS X多线程和内存管理

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

作者: KardelShaw | 来源:发表于2016-12-11 14:07 被阅读0次

    内存管理篇的核心思路:
    (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];这条语句不会被执行。对对象的引用计数自然也不会有影响

    相关文章

      网友评论

          本文标题:《Objective-C高级编程iOS与OS X多线程和内存管理

          本文链接:https://www.haomeiwen.com/subject/dgkpmttx.html