我注意到Apple函数中的这种模式会返回错误
error:(NSError *__autoreleasing *)outError
我明白了它的意思,它指向指针,用于执行结果(使用*只会改变本地复制的变量,但不会改变外部的变量)但是我关注的是
__自动释放
如果我把它遗漏会怎么样?我有泄漏吗?为什么有必要?
........ ............. .........
答案 0 :(得分:6)
在定义函数时,您不必显式指定__autoreleasing
返回一个对象,例如
-(BOOL)doSomething:(NSError **)error;
ARC编译器会自动插入__autoreleasing
。这在解释中
Clang/ARC文档:
4.4.2间接参数
如果函数或方法参数的类型为T *,则其中T为 所有权不合格的可保留对象指针类型,然后:
- 如果T是const限定的或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“通过回写传递出参数” Clang / ARC文档。)