ARC由以下工具来实现:
- clang(LLVM编译器)3.0以上
- objc4 Objective-C运行时库493.9以上
下面我们,我们将围绕clang汇编输出和objc4库的源代码探究ARC实现
1. __strong修饰符
1.1 赋值给附有__strong修饰符的变量
看下面代码
{
id __strong obj = [[NSObject alloc] init];
}
实际上,该源代码可以转换为调用以下的函数。
id obj = objc_msgSend(NSObject, @selector(alloc));
objc_msgSend(obj, @selector(init));
objc_release(obj);
如原源代码所示,2次调用objc_msgSend方法,变量域结束时通过objc_release释放对象。
1.2 使用alloc/new/copy/mutableCopy以外的方法
{
id __strong obj = [NSMutableArray array];
}
转换如下:
id obj = objc_msgSend(NSMutableArray, @selector(array));
objc_retainAutoreleasedReturnValue(obj);
objc_release(obj);
objc_retainAutoreleasedReturnValue()函数主要用于最优化程序运行。它用于自己持有(retained)对象的函数,但它持有的对象应为返回注册在autoreleasepool中对象的方法或是函数的返回值。像该源代码这样,在调用alloc/new/copy/mutableCopy以外的方法,由编译器插入该函数。
下面看看NSMutableArray类的array方法的源代码:
+ (id)array {
return [[NSMutableArray alloc] init];
}
以下为该源代码的转换: