在 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
关键字添加到参数类型会稍微减少编译器的工作,因为它不必将当前值读入临时变量——但这并不能解决错误。