2012-08-08 24 views
3

我知道这似乎是一个非常基本的问题,但我一直认为解释(和理解)基本问题是构建干净和有效代码的关键。在Xcode中运行“分析”我得到了著名的“潜在的空提领”创建错误时在处理NSError时理解'潜在的空解除引用'

-(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; 
} 

: 我的代码在CoreData实体下面的代码片段。虽然编译器没有提供任何警报,并且代码一直工作。 这也可能是一个问题,为什么编译器没有提醒我这个问题?但是到代码中,我完全知道这个解决方案,它是检查(错误!=无),但是我在这方面很迷茫。 问题从一开始就在NSError * _autoreleasing *的意思,为什么周围的明星?哪一个应该是一个指针指针?

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

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

最后但并非最不重要的是,代码工作正常,错误被拦截,请问您能否发现可能导致错误或崩溃的案例?正如我所说我正在使用CoreData,一个通用的例子会很好,但另一个与CoreData有关的赞赏。

感谢

回答

3
*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上也有很多答案。

+0

我完全错过了autoreleasing的含义,我把它想成是一个变量名!感谢您的解释,对我来说,标记为答案已经足够了。 – Leonardo 2012-08-17 12:17:28

+0

不客气。 – 2012-08-17 12:22:55