0

次のスニペットを実行した後、アプリがクラッシュしました (iOS/iPhone)。

    NSHTTPURLResponse *urlResponse = nil;
    NSError *error = [[NSError alloc] init];

    NSData *responseData = [NSURLConnection sendSynchronousRequest:request returningResponse:&urlResponse error:&error];

    NSString *result = [[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding];


    if ([urlResponse statusCode] ==500 ) {

        ...

        }
    } else {
        NSLog(@"Response ==> status= %d", [urlResponse statusCode];
    }

    [result release];
    [error release];

コードはelseステートメントで到達し、statusCodeは「0」であり、[CFError release]が割り当て解除されたインスタンスに送信されたという情報でコードがクラッシュします。[error release] という行をコメントアウトしたところ、クラッシュは再発しませんでした。ただし、ここでリークを紹介します。

エラー変数の何が問題になっていますか? sendSynchonousRequest から使用されていますか?

問題を解決する最適な方法は何ですか?

4

2 に答える 2

2

エラーオブジェクトを作成する必要はありません。オブジェクトを NSURLConnection に設定すると、autorelease エラー オブジェクトが自動的に作成されます。エラーリリースもあるため、コードがクラッシュするのはそのためです

これを試して:

NSHTTPURLResponse *urlResponse = nil;
NSError *error = nil;

NSData *responseData = [NSURLConnection sendSynchronousRequest:request returningResponse:&urlResponse error:&error];

NSString *result = [[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding];


if ([urlResponse statusCode] ==500 ) {

    ...

    }
} else {
    NSLog(@"Response ==> status= %d", [urlResponse statusCode];
}

[result release];
于 2013-06-06T09:09:06.230 に答える
1

他のメソッドに渡されたエラー オブジェクトはほとんど初期化されません。エラーが発生した場合、渡したメソッドはエラー オブジェクトを作成します。このメソッドがエラー オブジェクトを作成したため、あなたはそのオブジェクトの所有者ではなく、エラーを解放しすぎています。エラー オブジェクトは autorelease として作成されます。

変化 :

NSError *error = [[NSError alloc] init]; 

NSError *error = nil;

を削除します。

[error release];
于 2013-06-06T09:08:48.560 に答える