2012-06-13 64 views
2

我剛剛在this answer上看過(答案已被刪除),並且我確定我看過應用程序在掛起後崩潰,所以我讀的內容有意義。螺紋鎖定目標C

如果您阻塞主線程時間太長,操作系統將會終止您的應用程序。


然而我寫了一些測試,發現沒有人造成應用上相互等待大約2-5分鐘後墜毀。斷點確認我正在運行主線程

  • 有人可以證實或反駁我讀請或有我只是挑了很多這是無阻塞的選擇嗎?

  • 如果我選擇了非阻塞選項,有人可以解釋爲什麼這些是非阻塞的?


while (true) { /*Nothing*/ } 

while (true) { NSLog(@"nothing"); } 

for(;;); 

sleep(100000000); 

while(true) { sleep(1); } 
+0

編輯器:這些行是有意指示單獨的測試。代碼不應該被編組在一起 –

回答

2

iOS只會在您的應用程序中花費太多時間來使用UIApplicationDelegate方法,如application:didFinishLaunchingWithOptions:applicationDidEnterBackground:。您通常有5秒鐘的時間返回,但這不適用於您的應用程序的調試版本。

阻止這些方法之外的主線程不會導致您的應用程序被終止。

+0

謝謝。 我寫的代碼阻塞了嗎?另一個答案似乎表明不。 –

+0

這取決於你的意思是阻止。當你發佈的每一行都是由一個線程執行的時候,那個線程將會停留在那裏而不會繼續前進。儘管技術上'睡眠(100000000)'行將在1157天后返回。 –

+1

我有一些等待呢!感謝您的澄清。 –

0

你提到的答案是不正確的,崩潰是因爲他內存不足,並不是因爲他阻塞了主線程。我相信你所提供的例子都不會阻止這個線程。真正阻止線程的方法是使用遞歸,或者以主隊列爲主參數的主線程調用dispatch_sync。這會造成死鎖,但我不認爲你的應用程序會因此而終止(儘管我可能是錯的)。

那麼,爲什麼這些非阻塞?取決於你如何定義阻塞。除了4th以外,您提供的所有示例只會阻止您的代碼進入下一行,這完全可以。 sleep(10000000)比這更弱,因爲它會在給定的秒數後正常返回,那麼爲什麼這會造成麻煩?

+0

是的,我寫了對這個問題的其他答案。但有趣的是,我意識到我並沒有阻止 –

+2

他們確實阻止了進程的線程。儘管睡眠是這樣的,但並不是所有的線程都是不可執行的。其中一些通過忙碌循環永遠阻止。 –