3

我知道这似乎是一个非常基本的问题,但我一直认为解释(和理解)基本问题是构建干净且有效的代码的关键。我在 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 中运行“分析”,我在创建错误时得到了著名的“潜在的 null 取消引用”。虽然编译器没有发出任何警报,但代码一直有效。这也可能是一个问题,为什么编译器没有警告我?

但是谈到代码,我完全知道解决方案,即检查是否(错误!= nil),但我对此很迷茫。问题从头开始,在 NSError *_autoreleasing* 的含义上,为什么是周围的星号?哪个应该是指向指针的指针?

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

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

最后但并非最不重要的一点是,代码运行良好,错误被拦截,你能找出一个可能导致它失败或崩溃的案例吗?正如我所说,我正在使用 CoreData,一个通用的例子会很好,但另一个与 CoreData 相关的例子值得赞赏。

谢谢

4

1 回答 1

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

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

[myObj validateForInsert:NULL];

如果你打电话

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

然后传递 的地址error,因此传递类型的变量NSError * *

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

您可以将变量声明为自动释放

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

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

有关详细信息,请阅读过渡到 ARC 发行说明。在 stackoverflow 上也有很多关于这个主题的答案。

于 2012-08-08T10:06:02.840 回答