__strong修饰符

先思考几个问题在读以下文章

  • 类方法的初始化和alloc初始化是怎么行进的?

  • objc_retainAutoleaseReturnValue函数的作用

  • objc_retainAutoleaseReturnValue函数.objc_autoleaseReturnValue函数是怎么协同工作的?
  • 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中而直接传递,这一过程达到了最优化

    最后在总结一下几个问题的答案吧


    1. 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);


    2. 最优化程序运行,可以视情况不注册到autoreleasePool中,直接传递到方法或者函数的调用方

    3. objc_autoreleaseReturnValue函数会检查使用该函数的方法或函数调用方的执行列表,如果方法或函数的调用方在调用了方法或函数后紧接着调用objc_retainAutoreleaseReturnValue()函数,那么就不将返回的对象注册到autoreleasePool中,直接传递到方法或者函数的调用方.

    你可能感兴趣的:(__strong修饰符)