2

我刚刚阅读了这个答案(答案已被删除),我确信我已经看到应用程序在挂起后崩溃,所以我读到的内容是有道理的。

如果你阻塞主线程太久,操作系统会杀死你的应用程序。


但是我写了一些测试,发现它们都没有导致应用程序在每个等待大约 2-5 分钟后崩溃。断点确认我正在主线程上运行。

  • 有人可以确认或反驳我读到的内容,还是我刚刚选择了很多非阻塞的选项?

  • 如果我选择了非阻塞选项,有人可以解释为什么这些是非阻塞的吗?


while (true) { /*Nothing*/ }

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

for(;;);

sleep(100000000);

while(true) { sleep(1); }
4

2 回答 2

2

UIApplicationDelegate如果在某些方法(如application:didFinishLaunchingWithOptions:或)上花费太长时间,iOS 只会杀死您的应用程序applicationDidEnterBackground:。您通常有 5 秒的时间返回,尽管这对于您的应用程序的调试版本不是强制的。

在这些方法之外阻塞主线程不会导致您的应用程序终止。

于 2012-06-13T14:50:59.830 回答
0

您所指的答案不正确,崩溃是因为他的内存不足,而不是因为他阻塞了主线程。我相信你给出的例子都没有阻塞线程。真正阻塞线程的方法是使用递归,或者从主线程调用dispatch_sync,主队列作为参数。这会造成死锁,但我认为您的应用程序不会因此而终止(尽管我可能是错的)。

那么为什么这些是非阻塞的呢?取决于您如何定义阻塞。除了第 4 行之外,您提供的所有示例都只会阻止您的代码进入下一行,这完全可以。sleep(10000000)甚至比这更弱,因为它会在给定的秒数后正确返回,那为什么会造成任何麻烦呢?

于 2012-06-13T14:46:49.480 回答