我知道这可能看起来是一个非常基本的问题,但我一直认为解释(和理解)基本问题是构建干净和工作代码的关键。 我在 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/