0

我將視圖控制器設置爲局部變量ASIHTTPFormDataRequest request的委託。ASIHTTPRequest popViewControllerAnimated:=>委託EXEC_BAD_ACCESS

但是,在請求完成之前點擊「返回」,彈出並取消分配視圖控制器。因此,當請求完成並將消息-requestDidFinish:發送給現在不存在的委託時,應用程序會崩潰,並出現異常。

我該如何解決這個問題?

  1. 我可以想到解決這個問題的一種方法是在導航控制器彈出它之後立即將代理設置爲零。但是,如果這是解決方案,我該怎麼做? (ARC的weak引用將現在是甜的。)

  2. 我能想到的另一種方法是使request視圖控制器的實例變量並調用視圖控制器的dealloc方法[request clearDelegatesAndCancel]; [request release];。這種方法概述在ASIHTTPRequest Example Code,但我已經被建議最好是請求局部變量而不是實例變量。而且,這個特定的視圖控制器是一個設置表視圖控制器,並有13個開關。爲了自動保存到服務器,每次切換創建&每次切換時都會發送一個新請求。如果我製作了ivars,那麼我必須製作13個。這是很多代碼!

想法?想法?

回答

3

我認爲第一個問題是:如果用戶按下開關後按回來,你會如何想要發生?即。應該取消http請求還是請求確實到達服務器很重要?我現在假設你確實想取消它們,因爲這似乎暗示了你的問題。

我被告知這是最好的做 請求局部變量,而不是 實例變量

我不知道,如果這是個好建議 - 你幾乎總是需要請求未是局部變量,所以你可以應付像這樣的情況。您可以考慮使用NSOperationQueue

粗糙步驟做到這將是:

  1. 在您的視圖控制器的init創建NSOperationQueue。
  2. 當你想一個http請求,將其添加到隊列ASIHTTPRequest,而不是調用startAsynchronous
  3. 在dealloc中,在隊列中迭代的對象,調用[request clearDelegatesAndCancel];爲每一個,然後釋放隊列。

這應該可以解決不需要13個ivars的崩潰!

+0

謝謝你的解決方案。這是一個諾貝爾和完全有效的答案,但我選擇[保留請求委託](http://stackoverflow.com/questions/6515191/asihttprequest-popviewcontrolleranimated-delegate-exec-bad-access/6529829#6529829)像' NSURLConnection'確實是因爲我相信Apple的設計決策,它更乾淨,並且它允許請求繼續加載,即使視圖控制器被彈出,這實際上是我想要的。 – ma11hew28