3

根据我目前的理解,“通过引用”的推荐方式(启用 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;

看来第二个的性能更好?因为它省略了“赋值回”和“自动释放”的过程。但我很少看到这样声明的函数。使用第二个函数来完成“按引用传递”工作是更好的方法吗?

有什么建议或解释吗?提前致谢。

4

1 回答 1

-1

第二个函数不是线程安全的/'延迟安全'。第一个更正确。

与为什么块捕获参数和 performSelector 保留对象的原因相同。


想象调用者 fA 分配了对 A 的强引用,然后调用了 ASYNC 函数 fB。fA 完成了,fB 还没有跟注.... 那么在此期间谁保留了 A?

于 2013-03-27T15:42:33.400 回答