__autoreleasing错误:(NSError*__ autoreleasing*)outError

Pet*_*isu 3 cocoa cocoa-touch objective-c automatic-ref-counting

我注意到Apple函数中的这种模式会返回错误

error:(NSError *__autoreleasing *)outError
Run Code Online (Sandbox Code Playgroud)

我理解它的含义,它指向指针,用于执行结果(使用*只会改变本地复制的变量,但不会改变外部的变量)但是我关心的是

__autoreleasing

如果我把它留下怎么办?我有泄漏吗?为什么有必要?

........ ............. .........

Mar*_*n R 7

例如,您不必__autoreleasing在定义返回对象的函数时明确指定

-(BOOL)doSomething:(NSError **)error;
Run Code Online (Sandbox Code Playgroud)

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];
Run Code Online (Sandbox Code Playgroud)

"转换到ARC发行说明"中所述,编译器会插入一个临时 __autoreleasing变量:

NSError *error;
NSError * __autoreleasing tmp = error;
BOOL success = [self doSomething:&tmp];
error = tmp;
Run Code Online (Sandbox Code Playgroud)

(有关详细信息,请参阅Clang/ARC文档中的4.3.4"通过回写传递输出参数".)