__strong

2018-06-25  本文已影响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中而直接传递。

上一篇 下一篇

猜你喜欢

热点阅读