关于“潜在空解除引用”的Clang错误

我不断得到Clang错误的代码,我不明白为什么他们是错误的,或者如何解决他们克朗的满意度:

+ (NSString *)checkForLength: (NSString *)theString error: (NSError **)error { BOOL hasLength = ([theString length] > 0); if (hasLength) return theString; else { *error = [NSError errorWithDomain:@"ErrorDomain" code:hasLength userInfo:nil]; return nil; } } 

撇开这个例子的完全devise的本质(Clang所反对的,所以这个例子足够说明问题),Clang在错误分配线上抱怨以下的反对意见:

潜在的空解除。 根据“创build和返回NSError对象”中的编码标准,参数“错误”可能为空。

我喜欢有一个原始的Clang报告。 我已阅读引用的文件,我不能看到一个方法去做预期的事情; 我查了一些开源的Cocoa库,这似乎是一个常见的习惯用法。 有任何想法吗?

该文件的清单3-5显示了预期的方式。 用你的例子代码:

 + (NSString *)checkForLength: (NSString *)theString error: (NSError **)error { BOOL hasLength = ([theString length] > 0); if (hasLength) return theString; else { if (error != NULL) *error = [NSError errorWithDomain:@"ErrorDomain" code:hasLength userInfo:nil]; return nil; } } 

Cocoa约定是返回值应该表示成功或失败(在这种情况下,返回nil表示失败),并且错误被附加信息填充,但是只有当调用者请求时。

换一种说法

 NSError *error = nil; NSString *result = [self checkForLength: aString error: &error]; 

 NSString *result = [self checkForLength: aString error: NULL]; 

都是调用该方法的有效方法。 所以方法体应该总是检查一个NULL错误参数:

 if (error != NULL) *error = ...; 
Interesting Posts