【问题标题】:__autoreleasing in error:(NSError *__autoreleasing *)outError__autoreleasing 错误:(NSError *__autoreleasing *)outError
【发布时间】:2014-06-09 17:15:45
【问题描述】:
我在返回错误的 Apple 函数中注意到了这种模式
error:(NSError *__autoreleasing *)outError
我理解它的含义,它是指向指针的指针,用于执行结果(仅使用 * 只会更改本地复制变量,但不会更改外部变量)但我担心:
__自动释放
如果我忽略它会怎样?我会漏水吗?为什么有必要?
【问题讨论】:
标签:
objective-c
cocoa-touch
cocoa
automatic-ref-counting
【解决方案1】:
在定义一个函数时,您不必显式指定 __autoreleasing
返回一个对象,例如
-(BOOL)doSomething:(NSError **)error;
ARC 编译器会自动插入__autoreleasing。这在
Clang/ARC 文档:
4.4.2 间接参数
如果函数或方法参数的类型为 T*,其中 T 是
所有权不合格的可保留对象指针类型,则:
- 如果 T 是 const-qualified 或 Class,那么它被隐式限定为
__unsafe_unretained;
- 否则,它会被 __autoreleasing 隐式限定。
Xcode 代码补全
也知道这一点并显示(NSError *__autoreleasing *)error。
当调用这样的函数时,ARC 编译器也会自动执行
“正确的事情”,所以你可以打电话
NSError *error;
BOOL success = [self doSomething:&error];
如"Transitioning to ARC Release Notes" 中所述,编译器会插入一个临时
__autoreleasing变量:
NSError *error;
NSError * __autoreleasing tmp = error;
BOOL success = [self doSomething:&tmp];
error = tmp;
(关于血淋淋的细节,你可以阅读 4.3.4 "Passing to an out parameter by writeback" in
Clang/ARC 文档。)