__ strong
id __strong obj = [[NSObject alloc] init];
转成源代码
id obj = objc_msgSend(NSObject @selector(alloc));
objc_msgSend(obj,@selector(init));
objc_release(obj);
两次调用objc_msgSend方法,alloc和init。变量作用域结束时通过objc_release释放对象。虽然ARC有效时不能使用release方法,但由此可知编译器自动插入了release。下面我们来看看使用alloc/new/copy/mutablecopy以外的方法是什么情况
id __strong obj = [NSMutableArray array];
转成源代码
id obj = objc_msgSend(NSMutableArray @selector(alloc));
objc_retainAutoreleasedReturnValue(obj);
objc_release(obj);
最开始的array方法的调用以及最后变量作用域结束时的release与之前相同。
objc_retainAutoreleasedReturnValue(obj);像源代码这样,在调用alloc/new/copy/mutableCopy以外的方法,像刚刚的array类方法调用之后,由编译器插入该函数。
这种objc_retainAutoreleasedReturnValue函数是成对的,与之相对的函数是objc_autoreleaseReturnValue。它用于alloc/new/copy/mutableCopy方法以外的NSMutableArray类的array类方法等返回对象的实现上。
+ (id)array {
return [[NSMUtableArray alloc ] init];
}
源码
+ (id)array {
id obj = objc_msgSend(NSMUtableArray, @selector(alloc));
objc_msgSend(obj, @selector(init));
return objc_autoreleaseReturnValue(obj);
}
像该源代码这样,返回注册到autoreleasepool中对象的方法使用了objc_autoreleaseReturnValue函数返回注册到autoreleasepool中的对象,但是objc_autoreleaseReturnValue函数同objc_autorelease函数不同,一般不仅限于对象到autoreleasepool中。
objc_autoreleaseReturnValue函数会检查使用该函数的方法或调用方的执行命令列表。如果方法或函数的调用方在调用了方法或函数后紧接这调用objc_retainAutoreleasedReturnValue(obj);函数,那么就不讲返回的对象注册到autoreleasepool中,而是直接传递到方法或函数的调用方。objc)retainAutoreleaseReturnValue函数与objc_retain函数不同,它即便不注册到autoreleasepool中而返回对象,也能够正确的获取对象。通过objc_autorekeaseReturnValue函数和objc_retainAutoReleaseReturnValue函数的协作,可以不将对象注册到autoreleasepool中而直接传递。
网友评论