2013-01-03 73 views
2

我在看一些舊的代碼,看到下面的if語句:isMainThread和currentThread == mainThread有什麼區別?

if ([NSThread currentThread] != [NSThread mainThread]) 

我暗自懷疑,這是不一樣的

if (![[NSThread currentThread] isMainThread]) 

我懷疑,因爲我們正在從字段中獲取一些崩潰報告(僅iOS 6),這些報告似乎是由需要在主線程上運行的代碼造成的。該代碼似乎受到前if語句的保護,但鑑於我們看到的崩潰數量,我並不確信。

這兩個if語句是否等價,還是有可能第一個會因爲某種原因失敗?

+1

最好的選擇是使用類方法:'+ [NSThread isMainThread]'。這比您的代碼更短,更清晰。 –

回答

1

[NSThread currentThread]如何返回同一個線程的不同實例 ?

該文檔不保證返回的NSThread實例始終相同。一個假想的實現可能是:

+ (NSThread *)currentThread { 
    return [[NSThread alloc] initWithPrivateIdentifier:pthread_self()]; 
} 

實際的實現不可能像這樣工作。我的直覺甚至認爲比較實例身份是安全的 - 但文檔不支持這一點。

給定線程有可能有多個實例嗎?

該文檔沒有說明相反情況。所以,是的,這至少是可以想象的。

我想確定這是否真的有機會修復崩潰,我無法重現。

實際上,在實踐中,我懷疑[NSThread currentThread] != [NSThread mainThread]+[NSThread isMainThread]不同,但這只是我的感覺。

+0

謝謝,這至少對我自己的理解是有幫助的。 – Mike

1

這可能是也可能不是相同的 - 使用!=的對象比較的結果通常沒有記錄。由於它是一個直接指針比較,它只會返回真實的同一個對象,而不是在邏輯等價的情況下。這就是爲什麼你應該總是使用專用的相等和比較方法來比較對象。

(在這裏,如果+ [NSThread mainThread]是單身人士,那麼他們真的有可能是相同的,但這是一個實現細節 - 即使它工作正常,您也不應該依賴它。)

+0

但理論上直接對象比較應該對我正在做的事很好,對吧?只有一個主線程,因此如果當前線程是主線程,則內存地址應該相同並通過測試。 – Mike

+1

@Mike號*實際上*直接對象比較可能沒問題。但是*理論上*由於+ [NSThread currentThread]沒有被記錄爲始終爲同一個線程返回相同的實例,所以它被破壞了。 –

+0

如果有一個專用的'isMainThread',你應該使用它,因爲不同的'NSThread'實例可能代表相同的底層線程。這可能並非如此,但如果他們給你這種方法,你應該使用它。 –