Почему iOS не убивает через короткое время, когда я вхожу в фон? - PullRequest
0 голосов
/ 19 августа 2011
- (void)applicationDidEnterBackground:(UIApplication *)application
{  
   NSLog(@"applicationDidEnterBackground");
   for(int x=0;;)
      {
         NSLog(@"%d",x++);
         sleep(1);
      }
}

Я нажимаю кнопку «Домой» на симуляторе с последней iOS 4.x iOS. Я подумал, что через 60 секунд его убьют, но он продолжался более 10 минут, печатая x. В приложении больше ничего не происходит, это скелетный «вид» сгенерированного кода, созданного Xcode.

1 Ответ

1 голос
/ 19 августа 2011

Таким образом, проблема в том, что вы «удерживаете» цикл выполнения, не позволяя 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" будет отображаться каждую секунду, пока вы не войдете в фон.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...