【发布时间】:2012-12-21 03:03:15
【问题描述】:
在 ARC 下,out 参数采用以下形式(默认情况下;这相当于 NSError **):
- (BOOL)tryWithError:(NSError *__autoreleasing *)err;
从Transitioning to ARC Release Notes,如果我们传递一个__strong局部变量的地址,编译器会创建一个临时变量并生成如下代码:
NSError *error; // strong
BOOL ok = [myObject tryWithError:&error];
// translated to
NSError *__strong error;
NSError *__autoreleasing tmp = error;
BOOL ok = [myObject tryWithError:&tmp];
error = tmp;
但是如果我们用实例变量来做:
@implementation Foo {
NSError *_error; // strong
}
- (void)bar
{
[myObject tryWithError:&_error];
}
...
这给了我们错误
将非本地对象的地址传递给
__autoreleasing参数以进行回写。
为什么无效?编译器不能自动将这样的代码翻译成这个吗?
- (void)bar
{
NSError *__autoreleasing tmp = _error;
[myObject tryWithError:&tmp];
_error = tmp;
}
毕竟,这就是我无论如何都会写来解决问题的!
注意:将out 关键字添加到参数类型will reduce the compiler's work slightly,因为它不必将当前值读入临时变量——但这并不能解决错误。子>
【问题讨论】:
标签: objective-c memory-management syntax automatic-ref-counting ownership