【发布时间】:2013-01-28 01:05:02
【问题描述】:
根据Transitioning to ARC Release Notes:
__autoreleasing 用于表示通过引用 (id *) 传递并在返回时自动释放的参数。
例如:
-(BOOL)performOperationWithError:(NSError * __autoreleasing *)error;
但与上述相比有什么优势:
-(BOOL)performOperationWithError:(NSError * __strong *)error;
更新:
几个答案提到了 temp var 技巧编译器处理 var 和参数之间的不匹配作为__autoreleasing 的优势。我不明白为什么编译器不能为__strong 参数做同样的技巧。我的意思是,对于 __weak var 和 __strong 参数,编译器可以类似地这样做:
NSError * __weak error;
NSError * __strong tmp = error;
BOOL OK = [myObject performOperationWithError:&tmp];
error = tmp;
if (!OK) {
// Report the error.
}
编译器知道-(BOOL)performOperationWithError:(NSError * __strong *)error; 返回一个强引用(+1),所以它就像任何new-family 方法一样处理它。由于tmp 与error 存在于同一范围内,因此只要error 编译器就可以合理地保持其活动状态,因此__weak 引用(error) 现在由__strong 引用(tmp) 支持) 并且在范围结束之前不会被取消。
【问题讨论】:
-
您尝试自己管理双指针的内存,然后告诉我们为什么 __autoreleasing 如此出色。
-
@CodaFi 即使使用 __strong,ARC 也会为我们进行内存管理,不是吗?
-
当然,但它使编译器的工作变得更加棘手。至少使用 __autoreleasing,tmp 变量被添加到内部自动释放池中(因为 NSError 的生命周期很短)。如果指针是强指针,它必须完成为第二个指针找出限定符并释放与其关联的对象的工作。无论哪种方式,你都是对的,但我宁愿使用 LLVM 的默认 __autoreleasing 双指针而不是任何 __strong 没有正当理由。
标签: objective-c automatic-ref-counting