【问题标题】:__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 文档。)

    【讨论】:

      猜你喜欢
      • 2012-11-15
      • 1970-01-01
      • 1970-01-01
      • 2013-03-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多