2012-02-08 54 views
1

我有一個叫做「Folio APIWrapperv2」的單例包裝類,負責處理我的iPhone應用程序中的所有API數據調用。ASIHTTPRequest中的線程

該類實現ASIHTTPRequest以從我的服務器獲取JSON。當一個ASIHTTPRequest完成時,它調用requestFinished :.在這種方法中,我對數據進行了額外的處理,可能需要幾秒鐘才能完成。這不是主要的,但它會稍微減慢應用程序,因爲它是一個阻塞的電話。爲了解決這個問題,我使用GCD創建了一個新線程。然而,這個線程運行時,我得到以下錯誤:

[FolioAPIWrapperv2 respondsToSelector:]: message sent to deallocated instance 0x245050 

該功能被稱爲在行ASIHTTPRequest的「handleBytesAvailable」的方法:

if ([[self delegate] respondsToSelector:[self didReceiveDataSelector]]) { 

我不知道這是怎麼回事這裏。 FolioAPIWrapperv2是一個單例類,所以它永遠不會被釋放。我嘗試過在線搜索,瞭解人們在線程中遇到了哪些其他問題,並找不到合適的解決方案。有人有想法嗎?

回答

0

您是否將委託設置爲該類的實例或類本身?代表必須是一個類的實例。

否則,如果你得到的輸出:

[FolioAPIWrapperv2 respondsToSelector:]: message sent to deallocated instance 0x245050 

那麼它很可能是你的類,它不應該被釋放是越來越釋放。

無論哪種方式,來處理這個至少一個辦法是增加一些調試,例如,當您創建請求:

NSLog("set delegate to %p", request.delegate); 

和類似日誌記錄在你的單身人士在init/dealloc的自我。

+0

好的,我做了一些測試,發現當線程在單例中調用一個方法時,它會被釋放。如果線程不調用單例中的方法,它就會起作用。你知道這裏發生了什麼嗎? – 2012-02-10 23:39:08

+0

@MichaelD。不是一個線索!嘗試在dealloc上貼上斷點,如果斷點釋放失敗/ autorelease - 應該會顯示正在執行釋放的代碼。 – JosephH 2012-02-11 12:12:44