2011-06-06 79 views
2

我正在使用第三方Objective-C庫在後臺線程中發出Web請求,然後使用[self performSelectorOnMainThread:...]返回結果,然後調用委託方法。我知道我需要在發佈委託前委託引用nil,但我想知道如果在後臺線程運行時請求對象本身被取消分配會發生什麼。此內部self參考值是否設置爲nil,以便-performSelectorOnMainThread:調用是無害的,還是有可能導致崩潰?自我釋放

回答

2

據我瞭解你的情況(但可能你應該包括一些代碼),聲明:

[self performSelectorOnMainThread:...] 

應該在你的線程中執行的最後一個(因爲它是返回的路上你的線程的結果,它仍然是傳遞給NSThread的線程選擇器的一部分)。

如果是合理的話,那麼考慮當你第一次分離的NSThread,你傳遞一個target對象(您self),並只要通過selector尚未完成NSThreadretain它。這將包括你的[self performSelectorOnMainThread:...],所以,除非有人用releases大量混亂,否則self[self performSelectorOnMainThread:...]執行之前不應該被釋放。

如果您的問題確實如果有人與releases混淆會發生什麼,我會再次考慮這一點。

+0

這就是我缺少的部分(即新線程將保留'self')。謝謝! – jrdioko 2011-06-06 18:30:41

2

如果在主線程上的方法完成之前解除分配了對象,則會出現內存管理問題。 performSelectorOnMainThread:…方法家族使得接收者在完成其工作之前一直保留下來,所以解除分配的唯一方式是如果你過度釋放對象。