根据我目前的理解,“通过引用传递”的推荐方式(启用ARC)如下:
-(void)somefunc:(someclass **)byref;
// and 'someclass **' should be inferred to 'someclass * __autoreleasing *'
// am i right?
//or we could just explicitly define it like
-(void)somefunc:(someclass * __autoreleasing *)byref;
但是,从这个帖子的答案Handling Pointer-to-Pointer Ownership Issues in ARC。
似乎 - (void)somefunc :( someclass * __ strong *)byref也可以做到这一点(在上面链接的demo2中)。
1.-(void)somefunc:(someclass * __autoreleasing *)byref;
2.-(void)somefunc:(someclass *__strong *)byref
对于第一个,正如Apple所记录的那样,它应该由编译器隐式重写,如下所示:
NSError * __strong error;
NSError * __autoreleasing tmp = error;
BOOL OK = [myObject performOperationWithError:&tmp];
error = tmp;
第二个似乎有更好的表现?因为它省略了“重新分配值”和“自动释放”的过程。但是我很少看到像这样声明的函数。使用第二个函数进行“按引用传递”工作是否更好?
有任何建议或解释吗?提前谢谢。
答案 0 :(得分:-1)
第二个函数不是线程安全的/'延迟安全'。第一个更正确。
为什么块捕获params和performSelector保留对象的原因相同。
想象调用者fA为A分配强引用,然后调用ASYNC函数fB。 fA已完成,fB尚未调用....所以谁在此期间保留了A?