__strong

作者: 帽子和五朵玫瑰 | 来源:发表于2018-06-25 11:28 被阅读0次

    __ 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中而直接传递。

    相关文章

      网友评论

          本文标题:__strong

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