[iOS]ASIHTTPRequestで前画面に戻るとクラッシュする場合の対処

ASIHTTPRequestで非同期通信をする場合、通信中にナビゲーションコントロールで前画面に戻るとアプリがクラッシュしてしまう不具合があり、色々難儀していたのですが、delegateを使用せずにBlocksを用いたところクラッシュしなくなりました。

修正前

- (void)sendData
{    
    NSString* url_ = @"http://www.hogehoge.hoge/api/";
    NSURL *url = [NSURL URLWithString:url_];
    
    NSString* taskPostData = @"";
    
    __block ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
    [request setResponseEncoding:NSUTF8StringEncoding];
    [request setDelegate:self];
    [request addRequestHeader:@"Accept" value:@"application/json"];
    [request addRequestHeader:@"Content-Type" value:@"application/json"];
    [request appendPostData:[taskPostData dataUsingEncoding:NSUTF8StringEncoding]];
    [request setRequestMethod:@"POST"];
    
    [request startAsynchronous];
}
- (void)requestFinished:(ASIHTTPRequest *)request
{
   //通信が成功した場合の処理を書く
}
- (void)requestFailed:(ASIHTTPRequest *)request
{
   //通信が失敗した場合の処理を書く
}

修正後

- (void)sendData
{   
    NSString* url_ = @"http://www.hogehoge.hoge/api/";
    NSURL *url = [NSURL URLWithString:url_];
    
    NSString* taskPostData = @"";
    __block ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
    
    [request setResponseEncoding:NSUTF8StringEncoding];
    [request addRequestHeader:@"Accept" value:@"application/json"];
    [request addRequestHeader:@"Content-Type" value:@"application/json"];
    [request appendPostData:[taskPostData dataUsingEncoding:NSUTF8StringEncoding]];
    [request setRequestMethod:@"POST"];
    
    [request setCompletionBlock:^{
        //通信が成功した場合の処理を書く
    }];
    [request setFailedBlock:^{
        //通信が失敗した場合の処理を書く
    
    }];
    [request startAsynchronous];
}

クラッシュする手順は下記の通りです。

      1.delegateを使用して非同期通信を開始
      2.ナビゲーションバーの戻るボタンで前画面に戻る(できるだけ早く)
      3.EXC_BAD_ACCESSで落ちる。。

タイミングの問題なのか、viewWillDisappearで下記のようにキャンセルを行なってもほぼ確実に落ちてしまう状態でした。

- (void)viewWillDisappear:(BOOL)animated {

    if (_reloading) {
        [self.request_ cancel];
        [self.request_ clearDelegatesAndCancel];
    }

}

なので今回は、delegateを使用せずにBlocksで再実装を行ったところ、クラッシュは発生しなくなりました。

ご質問やおかしな点などありましたらコメントやツイッター(@yokada3)でご指摘頂けますでしょうか。

参考ページ:

同じ質問をしている方がいました。今回の対応とは違いますが、いくつか回答があります。
iphone – asihttprequest crashes my app – Stack Overflow

やはり公式にはちゃんと目を通さないとですね。
ASIHTTPRequest Documentation – All-Seeing Interactive

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

*

次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>