0

ビューコントローラをローカル変数ASIHTTPFormDataRequest requestのデリゲートに設定しました。ASIHTTPRequest popViewControllerAnimated:=>デリゲートEXEC_BAD_ACCESS

しかし、要求が完了する前に「戻る」をタップすると、ビューコントローラがポップされ、割り当てが解除されます。したがって、要求が完了し、今すぐ存在しないデリゲートに-requestDidFinish:というメッセージを送信すると、アプリケーションはEXEC_BAD_ACECESS例外でクラッシュします。

このクラッシュを解決するにはどうすればよいですか?

  1. これを解決する方法の1つは、ナビゲーションコントローラがポップした直後にデリゲートをnilに設定することです。しかし、それが解決策なら、どうすればいいのですか? (ARCのweak参照は今甘いだろう。)

  2. 私は考えることができるもう一つの方法は、requestビューコントローラのインスタンス変数を作成し、ビューコントローラのdealloc方法で[request clearDelegatesAndCancel]; [request release];を呼び出すことです。このアプローチはASIHTTPRequest Example Codeで概説されていますが、インスタンス変数の代わりにローカル変数を要求することをお勧めします。そして、この特定のビューコントローラは、設定テーブルビューコントローラであり、13個のスイッチを有する。サーバーへの自動保存の場合、各スイッチは、トグルされるたびに&が新しい要求を送信するように作成します。私がイヴァールを作ったなら、私は13を作らなければならないでしょう。それはたくさんのコードです!

考えられますか?アイデア?

答えて

3

私は最初の質問は何ですか:は、スイッチを押した後に戻ると発生するようにしますか?すなわち、 httpリクエストがキャンセルされるか、リクエストがサーバーに届くことが重要ですか?私はあなたの質問に暗示されているように、あなたがそれらを取り消したいと思っていると今は仮定します。

私はそれが 要求ローカル変数の代わりに、 インスタンス変数

私はそれは良いアドバイスだったかはわからないを作るのがベストですお勧めしてきました - あなたはほとんど常にないへのリクエストをしたいですこのようなケースに対処できるように、ローカル変数にする必要があります。

あなたの場合、NSOperationQueueの使用を検討することができます。これを行うには

ラフ手順は次のようになります。

  1. あなたのビューコントローラの初期化にNSOperationQueueを作成します。
  2. あなたは、httpリクエストを行う代わりにdeallocで
  3. startAsynchronousコールのASIHTTPRequestキューに追加し、キュー内のオブジェクトを反復処理し、それぞれに対して[request clearDelegatesAndCancel];を呼び出し、その後、キューを解除したいとき。

これは、13個のイーバルズを必要とせずにクラッシュを解決するはずです。

+0

ありがとうございます。これは貴重で完全に有効な回答ですが、私は[依頼委任を保持する](http://stackoverflow.com/questions/6515191/asihttprequest-popviewcontrolleranimated-delegate-exec-bad-access/6529829#6529829)のように ' NSURLConnectionは私がAppleの設計上の意思決定を信用しているので、よりクリーンで、View Controllerがポップされても要求が継続できるようになります。これは実際に私が望むものです。 – ma11hew28

関連する問題