Почему закрытие симулятора заставляет мое приложение получать SIGTERM, когда мое приложение работает в фоновом режиме?

#objective-c #ios #cocoa-touch #memory-management

#objective-c #iOS #cocoa-touch #управление памятью

Вопрос:

Когда я получаю это:

 - (void)applicationWillResignActive:(UIApplication *)application {
  

Я освобождаю все свои объекты и аннулирую все свои таймеры.

Когда я получаю это:

  - (void)applicationDidBecomeActive:(UIApplication *)application {
  

Я перераспределяю все свои объекты и снова запускаю свои таймеры.

Все работает нормально, за исключением того, что теперь, если я переведу свою программу в фоновый режим, я фактически завершу программу, закрыв симулятор IOS, он выдает сигнал SIGTERM в строке:

 int retVal = UIApplicationMain(argc, argv, nil, nil);
  

С другой стороны, если я завершу программу, закрыв симулятор IOS, не переведя его сначала в фоновый режим, он не выдаст сигнал SIGTERM.

Я делаю что-то не так?


Для меня основной причиной такого рода SIGTERM было следующее. Если я освобождаю какой-либо объект, который мне никогда не принадлежал или уже выпущен непосредственно перед завершением программы, я получаю этот SIGTERM при завершении программы.

Я не знаю, как получить информацию от симулятора или отладчика о том, с каким объектом я это сделал. Но, зная из SIGTERM, что я выполнил посторонний релиз, мне было достаточно, чтобы найти его путем проверки.

Если кто-нибудь знает, как посмотреть, какой объект был выпущен посторонним в xcode, пожалуйста, свяжитесь с нами.

Ответ №1:

Ты не делаешь ничего плохого. Когда вы закрываете симулятор iOS, он убивает ваше приложение, отправляя его SIGTERM . Точка. Именно так это и работает. Если вы оставите свое приложение на переднем плане, оно все равно будет уничтожено, только не a SIGTERM . Ваше приложение все еще подключено к симулятору, когда оно работает в фоновом режиме; оно не может продолжать существовать без симулятора, и у него нет возможности подключиться к другому экземпляру симулятора, если вы его запустите.

Если вы не хотите, чтобы ваше приложение получало SIGTERM , не закрывайте симулятор.