2011-10-07 59 views
0

detachNewThreadSelector工作與performSelectorInBackground有什麼不同嗎?在項目中,我使用了很多這樣的:detachNewThreadSelector的工作方式與NSThread performSelectorInBackground或NSThread alloc/init的工作方式不同嗎[線程啓動]

[self performSelectorInBackground:@selector(startImageDownloads:) withObject:[NSNumber numberWithInt:dataType]]; 

,但會做這個有什麼不同:

[NSThread detachNewThreadSelector:@selector(startImageDownloads:) toTarget:self withObject:[NSNumber numberWithInt:dataType]]; 

而且也,除了能與imgDlThread訪問線程對象,會分配/初始化「荷蘭國際集團線程然後start荷蘭國際集團它的工作有什麼不同然後第2:

NSThread *imgDlThread = [[NSThread alloc] initWithTarget:self selector:@selector(startImageDownloads:) object:[NSNumber numberWithInt:dataType]]; 
[imgDlThread start]; 

謝謝!


編輯:

剛剛意識到有對SO已經爲performSelectorInBackgrounddetachNewThreadSelector之間的差異(或缺乏)幾個答案,所以我想我唯一的問題是:

是分配和初始化NSThread然後調用[thread start]任何不同,那麼第2?

回答

1

第三方法和前兩個是存儲器管理之間的唯一區別。當您分配一個線程,它保留了它的target,只有當線程釋放被釋放。該detatchNewThreadSelector:performSelectorInBackground:方法都自動釋放所創建的結果NSThread,這意味着,一旦線程執行完畢,該target將被釋放。

在您提供的代碼中(分配線程並啓動它),您正在泄漏imgDlThread,這意味着target將永遠不會被釋放,並且反過來會自我泄漏。如果在啓動之後自動釋放,甚至定期發佈imgDlThread,它將有作爲detachNewThreadSelector:完全一樣的效果。

相關問題