2011-03-21 63 views
1

這兩者之間的區別是什麼?Objective-C,NSThread分離與performSelectorInBackground

[NSThread detachNewThreadSelector:@selector(method) toTarget:self withObject:nil]; 
[self performSelectorInBackground:@selector(method) withObject:nil]; 

我通常使用第二種方法來產生一個新的線程。 但我想知道如果我在下面的方法中調用這個兩次,那麼會發生什麼?另外如果我有一個tabmenu和每個菜單產生一個線程,那麼我應該使用哪一個?

[self performSelectorInBackground:@selector(method1) withObject:nil]; 
[self performSelectorInBackground:@selector(method2) withObject:nil]; 
+0

可能重複的[Objective C - performSelectorInBackground V.S detachNewThreadSelector?](http://stackoverflow.com/questions/5148980/objective-c-performselectorinbackground-v-s-detachnewthreadselector) – 2011-03-21 02:21:23

+0

它們本質上是相同的。看看[這個SO回答](http://stackoverflow.com/questions/5148980/objective-c-performselectorinbackground-v-s-detachnewthreadselector/5149043#5149043)以供參考。 – David 2011-03-21 00:32:07

回答

6

它們是相同的。這裏是什麼official documentation必須對這個話題說:

在 的iOS和Mac OS X v10.5及其更高版本中,所有 對象必須產生一個 新的線程,並用它來執行一個能力他們的方法的 。 performSelectorInBackground:withObject: 方法創建一個新的分離線程 並使用指定的方法作爲新線程的入口點 。對於 例如,如果你有一些對象 (由變量MyObj中表示) 和對象有一個名爲 DoSomething的方法要在 後臺線程運行,你可以可以使用 下面的代碼來做到這一點:

[myObj performSelectorInBackground:@selector(doSomething) withObject:nil];

調用 這種方法的效果是一樣的,如果你 稱爲 detachNewThreadSelector:toTarget:withObject:NSThread的 方法與當前 對象,選擇器和參數對象 作爲參數。新線程 立即使用默認的 配置產生並開始運行。 在選擇器內部,您必須 配置線程,就像您將 任何線程一樣。例如,您需要設置一個自動釋放池(如果 您沒有使用垃圾回收) 並配置線程的運行循環,如果您計劃使用它 。有關如何配置新的線程的信息 ,請參閱 「配置線程屬性。」

至於如果這樣做會發生什麼:

[self performSelectorInBackground:@selector(method1) withObject:nil]; 
[self performSelectorInBackground:@selector(method2) withObject:nil]; 

...你將產生兩個新的線程,一個其中一個在method1處開始執行,其中一個開始在method2處執行。線程可以同時執行(即第二個線程在開始執行之前不會等待第一個線程終止)。

+0

非常感謝! – codereviewanskquestions 2011-03-21 01:09:14