当我进入后台时,为什么iOS在短时间内没有杀死?

时间:2011-08-19 17:19:10

标签: ios ios4

- (void)applicationDidEnterBackground:(UIApplication *)application
{  
   NSLog(@"applicationDidEnterBackground");
   for(int x=0;;)
      {
         NSLog(@"%d",x++);
         sleep(1);
      }
}

我在最新iOS 4.x iOS的模拟器上按主页按钮。我认为它会在60秒之后被杀掉,但它已经持续超过10分钟打印x。应用程序中没有其他任何内容,它的骨架“视图”生成的代码由Xcode创建。

1 个答案:

答案 0 :(得分:1)

所以这里的问题是你通过不让applicationDidEnterBackground返回来“保持”运行循环。 iOS需要在返回之后进行清理,所以如果不这样做,你实际上是在等待系统杀死你,它最终会自行决定。

要证明这一点,请删除“for”循环并将以下内容添加到应用代理的顶部:

dispatch_source_t __timer1;

...然后将其添加到您的应用程序:didFinishLaunchingWithOptions:

__timer1 = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, dispatch_get_main_queue());
if (__timer1)
{
    dispatch_source_set_timer(__timer1, dispatch_walltime(NULL, 0), 1ull * NSEC_PER_SEC, 1ull * NSEC_PER_SEC);
    dispatch_source_set_event_handler(__timer1, ^{
        NSLog(@"ping1");
    });
    dispatch_resume(__timer1);
}

因为现在你从applicationDidEnterBackground返回,你将获得预期的结果,“ping1”将每秒显示,直到你进入后台。