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

时间:2014-04-24 12:13:49

标签: objective-c cocoa-touch cocoa automatic-ref-counting

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

error:(NSError *__autoreleasing *)outError

我明白了它的意思,它指向指针,用于执行结果(使用*只会改变本地复制的变量,但不会改变外部的变量)但是我关注的是

  

__自动释放

如果我把它遗漏会怎么样?我有泄漏吗?为什么有必要?

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

1 个答案:

答案 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文档。)