【问题标题】:Automatic Reference Counting: Pointer to non-const type 'NSError *' with no explicit ownership自动引用计数:指向非 const 类型“NSError *”的指针,没有明确的所有权
【发布时间】:2011-12-09 21:43:46
【问题描述】:

在更新我的一些代码以与 iOS 5 SDK 兼容时,我尝试通过在 Xcode 中使用“转换为 Objective-C ARC”来重构我的代码并收到错误。错误发生在我的 .h 文件中的实例变量上。

NSError **_error;

错误提示“指向非 const 类型 'NSError *' 的指针没有明确的所有权。”我该如何解决这个问题?

【问题讨论】:

  • 这个问题(见stackoverflow.com/questions/6907726/…)是我能找到的关于这个主题的最接近的问题。
  • 为什么在实例变量中使用双重间接?您应该只需要方法参数,以便可以将 NSErrors 传递回来。
  • @BradLarson 好的,那么在调用将(NSError**):error 作为参数的方法时,初始化NSError 实例的正确方法是什么?
  • @SAFX - 与您在 ARC 之前所做的相同,NSError *error = nil;,然后您只需将 &error 传递到您的方法中。

标签: objective-c ios ios5 automatic-ref-counting


【解决方案1】:

您可以使用Transitioning to ARC Release Notes 中描述的生命周期限定符之一

对于 NSError **,您将使用 __autoreleasing,因此 Nikolai 提供的示例将如下所示

@interface Foo : NSObject
{
    NSError * __autoreleasing *error;
}

语法有点奇怪,你应该听从 Nikolais 的建议,但如果你确定 NSError ** 是你想要的,这应该可以工作。

【讨论】:

  • 这个不能编译,试试NSError * __autoreleasing *_error;
  • 这是正确答案。正如@NikolaiRuhe 所说,这样做并没有错。
  • 感谢您的回答!我想补充一点,我还使用了具有相同语法的其他生命周期限定符,例如 NSArray * __strong *array 等。
【解决方案2】:

在实例变量中存储NSError 对象时,您必须将其声明为简单指针:

@interface Foo : NSObject
{
    NSError *_errror;
}

NSError ** 仅用于将NSError 对象从方法间接返回给调用者。将其存储在实例变量中(可能)是错误的。

【讨论】:

    猜你喜欢
    • 2013-02-19
    • 2012-03-05
    • 2017-01-08
    • 2014-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-12
    • 1970-01-01
    相关资源
    最近更新 更多