内存管理篇:9.ARC实现之__autoreleasing
- __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);
- 对于将非调用方创建的对象,加入到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中。
网友评论