2012-01-26 36 views
0

我正在處理別人的代碼。我碰到一行代碼在此代碼段中使用NSThread

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

我有兩個問題要問。

  1. 它只是調用一個方法。爲什麼在這裏使用NSThread?
  2. 運行代碼時,在某些情況下,此方法不會被調用。當我在方法內部放置一個斷點時,它總是被調用。但是,如果我刪除斷點,在某些情況下該方法不會被調用。這是NSThread的問題嗎?

回答

3

以這種方式使用NSThread意味着方法「myMethod」在後臺線程上與其餘代碼同時被調用。它相當於這一點,你也可以看到:

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

如果這個方法沒有得到所謂的(或看起來象是不會被調用),它可能會下降到併發問題,即一個事實,即執行該方法的順序和在主線程中調用的順序不能保證,因此您期望它比實際調用時間更早。

如果你說:

[NSThread detachNewThreadSelector:@selector(methodA) toTarget:self withObject:nil]; 
[self methodB]; 

然後和了methodA會的methodB在同一時間運行並沒有保證會了methodA之前的methodB完成。

2

我總是結合使用NSThread detachNewThreadSelector具有自動釋放池,像這樣:

-(void)myMethod { 
     NSAutoReleasePool *pool = [[NSAutoReleasePool alloc] init]; 
     // .. Do stuff in this thread 
     [pool release]; 
    }; 

如果你想「簡單」進行選擇,像這樣做:

[self performSelector:@selector(myMethod)]; 
+0

這也是一個很好的建議,儘管現在你應該使用@autoreleasepool {...}來代替。 –

+0

如果你使用ARC'@ autoreleasepool'塊是要走的路,否則任何一種方式都可以:http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSAutoreleasePool_Class/Reference /Reference.html。 '@ autorelease'塊更有效(代碼)。 – basvk

+0

@autoreleasepool塊實際上也是更高性能 - 它們消除了創建附加對象和幾個Objective-C方法調用。它們不僅僅是語法糖,因爲它們可能看起來像。 –