2010-08-31 53 views
1

如果線程A將對象的引用發送給線程B,例如使用performSelector:onThread:withObject:waitUntilDone,內存管理應該如何進行?應該調用線程alloc的對象和被調用線程release嗎?線程間通信期間的內存管理職責

編輯:

事實證明,performSelector:onThread:withObject:waitUntilDone保留的對象,直到選擇,這將在其他線程的run loop被調用,用它做。所以調用線程應該分配,然後調用performSelector,然後釋放。

回答

2

事實證明,performSelector:onThread:withObject:waitUntilDone保留該對象,直到在其他線程的運行循環中調用的選擇器完成它爲止。所以調用線程應該是alloc,然後調用performSelector:onThread:withObject:waitUntilDone,然後release

1

我不確定這裏真的有一個「正確的」答案。如果調用線程退出或無法跟蹤內存不再使用並釋放它,我想你必須在被調用的線程中執行它。但是,一般來說,我更喜歡在分配的同一線程中釋放內存,理想情況是在代碼中。

我認爲關鍵是清楚地記錄你的期望和保持一致性。

+0

如何在調用線程和分配線程中知道被調用的線程何時完成對象,以便它可以安全地釋放它? – apalopohapa 2010-08-31 02:02:58

+0

你必須有某種線程間信號。通常情況下,您仍然希望擁有這個... – easel 2010-08-31 02:15:18

+0

如果通過某種隊列而不是直接發送信號的方式來訪問目標線程,那麼釋放源線程中的內存可能並不實際。我們可能不希望或不需要目標線程通知源,每個工作單元都已完成。 – 2010-08-31 12:51:11

2

一個可能防止過度泄漏或塗寫的選項是傳遞你的內存在boost :: shared_ptr中。當然,你可以保證當多線程有一個shared_ptr可以訪問內容時,內容的使用是線程安全的,這將確保留下有問題的內存的最終用戶的範圍會導致它被釋放。