美文网首页
__strong修饰符

__strong修饰符

作者: 有一种再见叫青春 | 来源:发表于2016-11-03 11:11 被阅读25次

    先思考几个问题在读以下文章
    <li>类方法的初始化和alloc初始化是怎么行进的?</li>
    <li>objc_retainAutoleaseReturnValue函数的作用</li>
    <li>objc_retainAutoleaseReturnValue函数.objc_autoleaseReturnValue函数是怎么协同工作的?</li>

    ARC条件下探究__strong修饰符的运行

    <pre>id obj = [NSObject alloc]init; /* 编辑器模拟代码*/ id obj = msg_Send (self,@selcetor(alloc)); msg_Send (self,@selcetor(init)); objc_release(obj);</pre>

    添加了__stong修饰符之后的

    <pre>id __strong obj = [NSMutableArray array];
    /* 编辑器模拟代码*/
    id obj = msg_Send (self,@selcetor(array));
    objc_retainAutoreleasedReturnValue(obj);
    objc_release(obj);</pre>

    下面讲解objc_retainAutoreleasedReturnValue函数
    objc_retainAutoreleasedReturnValue函数主要用于最优化程序运行,他是用于自己持有(retain)对象的函数,但它持有的对象应为返回注册在autoleasepool中对象的方法,或是函数的返回值,在调用alloc/new/copy以外的方法,即NSMutableArray类的array方法等调用之后,有编辑器插入该函数.
    这种objc_retainAutoreleasedReturnValue函数是成对的,与之对象的函数是objc_AutoreleaseReturnValue,运用于alloc/new/copy方法以外的类方法返回对象的实现上
    <pre>+(id ) array { return [NSMutableArray alloc]init; }</pre>

    源码为
    <pre>+(id ) array { id obj = objc_msgSend (NSMutableArray, @selector (alloc)); objc_msgSend (obj,@selector(init)); return objc_autoreleaseReturnValue(obj); }</pre>

    像该源码这样,返回注册到autoreleasePool中对象的方法使用了objc_autoreleaseReturnValue函数返回注册到autoleasepool中的对象.但objc_autoreleaseReturnValue函数和objc_autorelease函数不同,一般不仅限于注册对象到autoleasepool中.
    objc_autoreleaseReturnValue函数会检查使用该函数的方法或函数调用方的执行命令列表,如果方法或函数的调用方在调用了方法或函数后紧接着调用objc_autoreleaseReturnValue()函数,那么就不将返回的对象注册到autoleasepool中,而是直接传递到方法或函数的调用方.objc_autoreleaseReturnValue函数与objc_retain函数不同,它即便不注册到autoleasepool中而返回对象,也能正确的获取对象.通过objc_autoreleaseReturnValue和objc_retainautoreleasedReturnValue函数的协作,可以不讲对象注册到autoleasepool中而直接传递,这一过程达到了最优化

    最后在总结一下几个问题的答案吧
    <ol>
    <li> <pre>alloc方法: id obj = objc_msgSend(NSObject,@selector(alloc)); objc_msg(obj,@selector(init)); objc_release(obj);</pre>
    <pre>array方法: id obj = objc_msgSend(NSMutableArray,@selector(array)); objc_retainAutoreleaseReturnValue(obj); objc_release(obj);</pre>
    </li>
    <li> 最优化程序运行,可以视情况不注册到autoreleasePool中,直接传递到方法或者函数的调用方</li>
    <li><code>objc_autoreleaseReturnValue</code>函数会检查使用该函数的方法或函数调用方的执行列表,如果方法或函数的调用方在调用了方法或函数后紧接着调用objc_retainAutoreleaseReturnValue()函数,那么就不将返回的对象注册到autoreleasePool中,直接传递到方法或者函数的调用方.</li>

    </ol>

    相关文章

      网友评论

          本文标题:__strong修饰符

          本文链接:https://www.haomeiwen.com/subject/jambuttx.html