簡體   English   中英

ASIHTTPRequest popViewControllerAnimated: => 委托 EXEC_BAD_ACCESS

[英]ASIHTTPRequest popViewControllerAnimated: => delegate EXEC_BAD_ACCESS

我將視圖 controller 設置為局部變量ASIHTTPFormDataRequest request的委托。

但是,在請求完成之前點擊“返回”,彈出並取消分配視圖 controller。 因此,當請求完成並將消息-requestDidFinish:發送到現在不存在的委托時,應用程序會因EXEC_BAD_ACECESS異常而崩潰。

如何修復此崩潰?

  1. 我能想到的解決這個問題的一種方法是在導航 controller 彈出它后立即將代理設置為 nil。 但是,如果這是解決方案,我該怎么做? (ARC 的weak引用現在會很好。)

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

想法? 想法?

我認為第一個問題是:如果用戶在按下開關后按下回,你發生什么? IE。 是否應該取消 http 請求,或者請求到達服務器是否重要? 我現在假設您確實想取消它們,因為您的問題似乎暗示了這一點。

我被告知最好是請求本地變量而不是實例變量

我不確定這是否是個好建議——你幾乎總是希望請求不是局部變量,這樣你就可以處理這樣的情況。

對於您的情況,您可以考慮使用NSOperationQueue

執行此操作的粗略步驟是:

  1. 在您的視圖 controller init 中創建一個 NSOperationQueue。
  2. 當您要發出 http 請求時,將其添加到 ASIHTTPRequest 隊列而不是調用 startAsynchronous
  3. 在dealloc中,迭代隊列中的對象,調用[request clearDelegatesAndCancel]; 對於每一個,然后釋放隊列。

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

我通過保留請求委托來解決這個問題,例如NSURLConnection保留其委托

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM