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

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

作者: 我才是臭吉吉 | 来源:发表于2019-01-06 16:16 被阅读6次

    内存管理篇:9.ARC实现之__autoreleasing

    1. __autoreleasing修饰的变量与在非ARC环境下,对对象调用autorelease方法效果一致:
    @autoreleasePool {
        id __autoreleasing obj = [[NSObject alloc] init];
    }
    

    转换后的模拟代码为:

    // 创建pool
    id pool = objc_autoreleasePoolPush();
    
    // 创建对象
    id obj = objc_msgSend(NSObject, @selector(alloc));
    objc_msgSend(obj, @selector(init));
    
    // 加入到pool中
    objc_autorelease(obj);
    
    // 释放pool中的对象
    objc_autoreleasePoolPop(pool);
    
    1. 对于将非调用方创建的对象,加入到autoreleasePool中的情况,生成的代码如下:
    @autoreleasePool {
        id __autoreleasing obj = [NSMutableArray array];
    }
    

    转换后的模拟代码为:

    // 创建pool
    id pool = objc_autoreleasePoolPush();
    
    // 创建对象
    id obj = objc_msgSend(NSMutableArray, @selector(array));
    // 保留返回的自动释放对象(autorelease优化)
    objc_retainAutoreleasedReturnValue(obj);
    
    // 加入到pool中
    objc_autorelease(obj);
    
    // 释放pool中的对象
    objc_autoreleasePoolPop(pool);
    

    这里在前面__strong的情况中有说过,对于函数的返回值,ARC使用objc_autoreleaseReturnValue和objc_retainAutoreleasedReturnValue方法进行优化,避免了将生成的对象在pool中进行进入和取出操作。但是由于接收变量是使用__autoreleasing修饰的,故直接将其加入到pool中。

    相关文章

      网友评论

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

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