objective-c - 处理 NSError 时理解 'potential null dereference'

标签 objective-c nserror

我知道这可能看起来是一个非常基本的问题,但我一直认为解释(和理解)基本问题是构建干净和工作代码的关键。 我在 CoreData 实体中有以下代码片段:

-(BOOL)validateForInsert:(NSError *__autoreleasing *)error {
    [super validateForInsert:error];
    return [self validateInternal:error];
}

-(BOOL)validateInternal:(NSError *__autoreleasing *)error {
  // checking attributes and build userInfo error
  if(anyErrors) {
    *error = [NSError errorWithDomain:appDomain code:200 userInfo:details];
    return NO;
  }
  return YES;
}

通过在 Xcode 中运行“analyze”,我在创建错误时得到了著名的“potential null dereference”。虽然编译器没有发出任何警报,但代码始终有效。 这也可能是一个问题,为什么编译器不警告我?

但是对于代码,我完全知道解决方案,即检查 if (error != nil),但我对此一头雾水。 问题从头开始,在 NSError *_autoreleasing* 的意思上,为什么是周围的 star ?哪个应该是指向指针的指针?

假设我想自己调用 validateForInsert:,我该如何构建一个 *_autoreleasing* 对象?

我想下面的问题与上面的问题有关:如果我从头开始构建 *error,为什么我要先检查是否为 nil?

最后但并非最不重要的一点是,代码运行良好,错误被截获,您能找出一个可能导致它失败或崩溃的案例吗?正如我所说的,我正在使用 CoreData,一个通用的示例就可以了,但另一个与 CoreData 相关的示例将受到赞赏。

谢谢

最佳答案

*error = [NSError errorWithDomain:appDomain code:200 userInfo:details];

在语法上是正确的,因此编译器不会发出警告。分析器检测到如果 error = NULL,即如果您调用

,这将在运行时崩溃
[myObj validateForInsert:NULL];

如果你打电话

NSError *error;
[myObj validateForInsert:&error];

然后你传递了error的地址,因此你传递了一个类型为NSError * *的变量。

__autoreleasing 修饰符提示 ARC 编译器分配给 error 的对象是一个自动释放的对象。

你可以声明一个变量来自动释放

NSError * __autoreleasing error;
[myObj validateForInsert:&error];

但通常你不在乎。 ARC 只会生成正确的代码。

有关详细信息,请阅读 Transitioning to ARC Release Notes .在 stackoverflow 上也有很多关于这个主题的答案。

关于objective-c - 处理 NSError 时理解 'potential null dereference',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11861612/

相关文章:

ios - 将 subview 添加到 UITableViewController

iOS - 填充静态 UIPickerView

iphone - 我如何知道页面何时无法在 UIWebView 中加载而不是被用户加载为 "Stopped"?

ios - iOS 7 和 8 之间不同的 NSError localizedDescription

objective-c - [__NSArrayM 插入对象 :atIndex:]: object cannot be nil - how determine where is the error?

objective-c - ios 不兼容的指针类型从 NSError _autoreleasing 分配给 NSError _strong

ios - NSKeyedArchiver archivedDataWithRootObject 在传递图像模型数组时返回 nil

ios - 创建具有特定属性的 NSArray

ios - 如何在每个显示文本的触摸按钮后打印空格

ios - 代码 -6003 是否有类似 NSURLError 枚举的常量?