我一直在以下类型的代码上出现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;
}
}
撇开这个例子的完全设计性质(Clang确实反对,所以它足够说明),Clang在错误分配线上发表了以下反对意见:
潜在的空取消引用。根据“创建和返回
NSError
对象”中的编码标准,参数“错误”可能为空。
我喜欢原始的Clang报告。我已经阅读了所引用的文件,我看不到做出预期的方法;我检查了一些开源的Cocoa库,这似乎是一个常见的习惯用法。有什么想法吗?
答案 0 :(得分:96)
该文件的清单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;
}
}
答案 1 :(得分:17)
Cocoa约定是返回值应该指示成功或失败(在这种情况下,您为失败返回nil)并且错误被填入其他信息,但仅在调用者请求它时。
换句话说
NSError *error = nil;
NSString *result = [self checkForLength: aString error: &error];
和
NSString *result = [self checkForLength: aString error: NULL];
是调用该方法的有效方法。所以方法体应该总是检查一个NULL错误参数:
if (error != NULL)
*error = ...;