NSErrorな変数をnilで初期化してあげないとアレな件
NSURLConnectionを使った通信プログラムを書いていたところ、下記のようなexample.comからデータを持ってくるだけのコードがEXC_BAD_ACCESSで落ちてしまう。
- (void)doIt { NSHTTPURLResponse *res; NSError *error; NSURL *url = [NSURL URLWithString:@"http://example.com/com"]; NSURLRequest *req = [NSURLRequest requestWithURL:url]; NSData *data = [NSURLConnection sendSynchronousRequest:req returningResponse:&res error:&error]; if (!error) { NSLog(@"data: %@", [[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding] autorelease]); NSLog(@"status code: %d", [res statusCode]); } else { NSLog(@"error: %@", error); } }
デバッガで追ってみたところ、変数errorの初期値が0じゃなく何か適当な値が入っているせいで、通信が成功したか失敗したかを確認するif文のところで常にエラー側に処理が流れ、いざNSErrorオブジェクトを出力しようとすると変数errorが指しているアドレスの先にはNSErrorオブジェクトなんて存在しないためにEXC_BAD_ACCESSが発生、ということみたい。変数errorは0で初期化されると思い込んでいたのだけどそういうわけじゃないのねー。
ということで変数errorをnilで初期化してやることでうまく動くようになったよ。
NSError *error; // 修正前
NSError *error = nil; // 修正後