先思考几个问题在读以下文章
ARC条件下探究__strong修饰符的运行
id obj = [NSObject alloc]init; /* 编辑器模拟代码*/ id obj = msg_Send (self,@selcetor(alloc)); msg_Send (self,@selcetor(init)); objc_release(obj);
添加了__stong修饰符之后的
id __strong obj = [NSMutableArray array];
/* 编辑器模拟代码*/
id obj = msg_Send (self,@selcetor(array));
objc_retainAutoreleasedReturnValue(obj);
objc_release(obj);
下面讲解objc_retainAutoreleasedReturnValue函数
objc_retainAutoreleasedReturnValue函数主要用于最优化程序运行,他是用于自己持有(retain)对象的函数,但它持有的对象应为返回注册在autoleasepool中对象的方法,或是函数的返回值,在调用alloc/new/copy以外的方法,即NSMutableArray类的array方法等调用之后,有编辑器插入该函数.
这种objc_retainAutoreleasedReturnValue函数是成对的,与之对象的函数是objc_AutoreleaseReturnValue,运用于alloc/new/copy方法以外的类方法返回对象的实现上
+(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函数返回注册到autoleasepool中的对象.但objc_autoreleaseReturnValue函数和objc_autorelease函数不同,一般不仅限于注册对象到autoleasepool中.
objc_autoreleaseReturnValue函数会检查使用该函数的方法或函数调用方的执行命令列表,如果方法或函数的调用方在调用了方法或函数后紧接着调用objc_autoreleaseReturnValue()函数,那么就不将返回的对象注册到autoleasepool中,而是直接传递到方法或函数的调用方.objc_autoreleaseReturnValue函数与objc_retain函数不同,它即便不注册到autoleasepool中而返回对象,也能正确的获取对象.通过objc_autoreleaseReturnValue和objc_retainautoreleasedReturnValue函数的协作,可以不讲对象注册到autoleasepool中而直接传递,这一过程达到了最优化
最后在总结一下几个问题的答案吧
-
alloc方法: id obj = objc_msgSend(NSObject,@selector(alloc)); objc_msg(obj,@selector(init)); objc_release(obj);
array方法: id obj = objc_msgSend(NSMutableArray,@selector(array)); objc_retainAutoreleaseReturnValue(obj); objc_release(obj);
- 最优化程序运行,可以视情况不注册到autoreleasePool中,直接传递到方法或者函数的调用方
objc_autoreleaseReturnValue
函数会检查使用该函数的方法或函数调用方的执行列表,如果方法或函数的调用方在调用了方法或函数后紧接着调用objc_retainAutoreleaseReturnValue()函数,那么就不将返回的对象注册到autoreleasePool中,直接传递到方法或者函数的调用方.