#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
, не закрывайте симулятор.