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

内存管理篇: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多线程与内存管理》9)