2

関数に渡されたものに NSError を割り当てようとすると、なぜエラーが発生するのかについて、2 番目の目が必要です。

// Response and Error Objs.
NSURLResponse *response = nil;
NSError *requestError = nil;

// Attempt authentication
[NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&requestError];

// Error?
if (requestError != nil) {
    *error = requestError; // Error happens here
    return;
}
4

5 に答える 5

1

Apple のError Handling Programming Guideから

重要:成功または失敗は、メソッドの戻り値によって示されます。Cocoa エラー ドメインで間接的にエラー オブジェクトを返す Cocoa メソッドは、nil または NO を直接返すことによってメソッドが失敗を示した場合、そのようなオブジェクトを返すことが保証されていますが、メソッドで何かをしようとする前に、戻り値が nil または NO であることを常に確認する必要があります。 NSError オブジェクト。

この場合、オブジェクトを-sendSynchronousRequest:returnResponse:error:返しNSDataます。エラーに進む前に、それが nil かどうかを確認する必要があります。

于 2011-10-24T23:33:15.437 に答える
0

を受け入れるメソッド署名があるとしましょうNSError**

これは、メソッドが値を指しているポインターへのポインターを受け入れることを意味しNSErrorます。

したがって、エラーが NULL であるため、基本的にその NULL オブジェクトに、それが指している物の値は何かを尋ねているのではないかと思います。しかしもちろん、NULL オブジェクトにその情報を要求することはできません。そのため、クラッシュします。

したがって、 の値を設定しようとする前に、そうではない*errorことを確認する必要があります。errorNULL

if (error == NULL) {
    // the function caller has supplied us with a nil as an argument
    // this indicates the caller does not care about the error
    return;
}

NULL代わりにチェックする必要がnilある理由は、ココアオブジェクトではなくメモリの場所をチェックしているためです。

于 2015-02-20T05:59:58.737 に答える
0

使用しようとしている形式で「エラー」を使用することはできません。NSURLConnection でエラーにアクセスできますが、その外部にはアクセスできません。したがって、使用する前にエラー オブジェクトを定義する必要があります。

于 2011-10-24T23:34:28.930 に答える
0

NSError を忘れましたか:

if (requestError != nil) {
    NSError *error = requestError; // Error happens here
    return;
}

または、どこで/いつerror宣言/定義され、あるエラーオブジェクトを別のエラーオブジェクトに割り当てるポイントは何ですか? それだけではない理由:

if (requestError != nil) {
    NSLog(@"%@", [requestError localizedDescription]);
    return;
}
于 2011-10-24T23:30:34.080 に答える
0

ほとんど*errorの場合、有効なポインターを指していません。サンプルは完全ではないので、確実なことは言えません。おそらく*errorゼロです。

于 2011-10-24T23:30:46.777 に答える