2011-05-17 20 views
0

在我的代碼搜索控制器我使用NSthread。對於我們在搜索欄中輸入的每個字符,都會在接下來的線程開始時創建一個新線程。我們如何釋放這些導致內存泄漏的NSThread?如何釋放NSThread是否有任何特定的進程要釋放?

這裏是我的NSThreads創建:

if (searchString.length > 1) { 
    self.searchThread = [[[NSThread alloc] initWithTarget:self selector:@selector(filterContentForSearchTextInBackgroundThread:) object:searchString] autorelease]; 
    [self.searchThread start]; 

} 
+0

以下是您可能感興趣的兩個相關問題:http://stackoverflow.com/questions/11514739/should-i-release-the-nsthread-i-create和http://stackoverflow.com/questions/ 7749326/please-explain-me-about-this-leak/7749478 – Calvin 2012-07-17 17:59:04

回答

4

答:self.searchThread = nil;將釋放線程當它執行完畢

較長的答案;你真的真的不想在每次擊鍵時產生一個線程。如果你打算使用線程,你應該有一個處理按鍵的線程,並且你應該告訴那個線程有關鍵擊的發生。

這意味着您可能需要某種「取消當前查詢並啓動一個新的」機制。

+0

看起來像設置'self.searchThread = nil'是一種沒有意義的手勢,除非啓用垃圾回收功能。線程已經被自動釋放;這應該夠了。 – Calvin 2012-07-17 16:06:08

+0

你不能在創建對象的autorelease時平衡一個屬性的保留;這將導致非常壞的東西(如書面,OP的代碼是+1 RC(alloc),-1 RC(延遲),+1 RC(賦值)。因此,是的,除非ARC被啓用,否則您需要設置財產去零或釋放伊娃直接平衡保留的任務。 – bbum 2012-07-17 16:49:48

+0

Objective-C中的賦值操作不會修改引用計數。查看代碼,我看到+1 RC(alloc)和-1 RC(被autorelease延遲) – Calvin 2012-07-17 17:36:42