关于“潜在空解除引用”的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 = ...;