51

我在以下类型的代码中不断收到 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 拒绝错误分配行,并提出以下反对意见:

潜在的 null 取消引用。根据“创建和返回NSError对象”中的编码标准,参数“错误”可能为空。

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

4

2 回答 2

102

该文档中的清单 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;
    }
}
于 2009-07-27T17:36:06.893 回答
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 = ...;
于 2009-07-27T17:44:36.783 回答