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、パラメータ「エラー」はnullになる可能性があります。

手付かずの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 に答える