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

内存管理篇:7.ARC实现之__strong及autorelease优化

对于持有非自己创建的对象的情况,我们知道,这种情况是指对于非“alloc、new、copy和mutableCopy”开头的并返回对象实例的方法,接收方不负责内存管理。
ARC会在方法实现中将返回值加入到autoreleasePool中,待接收方从中取出使用,延迟释放时机。

但是实际上,代码并不会都如我们想象的那样,因为会有更优化的执行。先看代码:

{
    id __strong obj = [NSMutableArray array];
}

编译后的模拟代码为:

// 发消息创建对象
id obj = objc_msgSend(NSMutableArray, @selector(array));
// ???
objc_retainAutoreleasedReturnValue(obj);
// 正常释放对象
objc_release(obj);

而对于NSMutableArray的array方法,编译后的模拟代码为:

+ (id)array {
    // 正常的二段式创建
    id obj = objc_msgSend(NSMutableArray, @selector(alloc));
    objc_msgSend(obj, @selector(init));
    // ???
    return objc_autoreleaseReturnValue(obj);
}

在以上代码中可以看到,在这种情况下,ARC使用了objc_autoreleaseReturnValue替代了autorelease操作,而调用方则使用objc_retainAutoreleasedReturnValue替代了传统的retain操作。作用是什么呢?

AutoRelease优化.jpg

使用这对方法(创建对象的方法返回使用objc_autoreleaseReturnValue返回的对象,而接收方使用objc_retainAutoreleasedReturnValue接收返回的对象)时,编译器实际上并没有将生成的对象加入到autoreleasePool中,而是直接将对象传递给接收方。避免了频繁地将对象在autoreleasePool中进行加入、取出操作,以达到最优效率。

你可能感兴趣的:(《Objective-C高级编程 iOS与OS X多线程与内存管理》7)