2

これが正しいかどうかはわかりません:

- (void)parseSomething:(id)targetObject error:(NSError **)error {
    NSError *parserError = nil;
    [myParser parse:targetObject error:&parserError];

    if (parserError != nil) {
        *error = parserError;
    }
}

この線:

*error = parserError;

パラメータのエラーをローカルエラーに設定しましたが、正しく行われていますか?

または私はすべきですか:

error = &parserError;

代わりは?

4

2 に答える 2

5

error逆参照を試みる前に、nil でないことを確認する必要があります。また、ローカルの NSError も必要ありません。そのコードを次のように記述します。

- (void)parseSomething:(id)targetObject error:(NSError **)error {
    [myParser parse:targetObject error:error];
}

しかし、ロケール変数が本当に必要な場合 (またはデモンストレーション目的)。次にこれ:

- (void)parseSomething:(id)targetObject error:(NSError **)error {
    NSError *parserError = nil;
    [myParser parse:targetObject error:&parserError];
    if (error && parserError) {
        *error = parserError;
    }
}

また、このような out パラメーターを持つほとんどのメソッドには、NSError通常、BOOL 戻り値またはその他の戻り値があり、成功したかどうかを示します。エラーがあったかどうかを示すために、エラー パラメータに頼るべきではありません。

- (BOOL)parseSomething:(id)targetObject error:(NSError **)error {
    NSError *parserError = nil;
    BOOL ok = [myParser parse:targetObject error:&parserError];
    if (error && parserError) {
        *error = parserError;
    }

    return ok;
}
于 2012-10-25T05:42:46.913 に答える
0

この場合、おそらく中間変数なしでさらにエラーを渡したいと思うでしょう。myParserただし、オブジェクトがエラー パラメータを適切に処理することを確認する必要があります。

- (void)parseSomething:(id)targetObject error:(NSError **)error
{
    [myParser parse:targetObject error:error];
}

ここで処理したい場合は、ポインターへのポインターerrorが何かを指していることを確認する必要があります。そうしないと、逆参照するときにクラッシュします。

例:メソッドは次のように呼び出されました

[object parseSomething:targetObject error:NULL];

次の行はクラッシュにつながります。

*error = parserError;

正しいコードは次のようになります。

- (void)parseSomething:(id)targetObject error:(NSError**)error
{
    NSError* parserError = nil;
    [myParser parse:targetObject error:&parserError];
    if (error != nil)
    {
        *error = parserError;
    }
}

parserErrorが nil の場合は問題ありませんが、nil の場合は問題ありませんerror

于 2012-10-25T05:46:48.210 に答える