метод dealloc выполняется нормально при выходе из приложения? - PullRequest
4 голосов
/ 22 февраля 2011

Я использую код, подобный следующему (например, внутри моего appController.m), чтобы выполнить некоторую очистку после завершения работы моего приложения ...

- (void) dealloc {
    [myObject release]; // myObject 's dealloc will not be called either !!!
    [arraySMSs release];
    [super dealloc];
}

Этот метод никогда не вызывается при выходе из приложения!Зачем ?Есть ли лучшее место, чтобы сделать мою уборку?Тот факт, что не называется, устраняет проблемы утечки памяти?Или ОС позаботится об очистке?

Спасибо ...

Ответы [ 4 ]

8 голосов
/ 22 февраля 2011

У системы нет оснований гарантировать, что каждый объект индивидуально освобождается после завершения работы приложения.

Это просто пустая трата циклов ЦП и пустая трата времени пользователя.

Когда приложение закрывается, все ресурсы, используемые этим приложением, возвращаются системой полностью автоматически и неизбежно.

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

3 голосов
/ 03 июня 2013

Хороший вопрос, я тоже был сбит с толку.

Теперь я получил это:

Сказал, что нет никакого объекта, управляемого нашим пользовательским кодом, который должен сам класс appDelegate, мы на самом деле ненужно беспокоиться, чтобы «выпустить» свой экземпляр.UIApplication является единственным классом, который сохраняет его, но мы не должны его.

Но, для академической дискуссии или если есть какая-то цель, которую я не знаю в данный момент, когда вы хотите проверить сделку в своемКласс appDelegate:

applicationWillTerminate - это правильное место, чтобы узнать, будет ли закрываться ваше приложение.

- (void)applicationWillTerminate:(UIApplication *)application
{
    // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.
    [UIApplication sharedApplication].delegate = nil;
    // after this, the dealloc method of our appDelegate class will be called
}
2 голосов
/ 03 сентября 2011

Вот цитата из NSObject Reference: «Важно: обратите внимание, что когда приложение завершает работу, объектам не может быть отправлено сообщение об освобождении памяти, поскольку память процесса автоматически очищается при выходе - эффективнее просто позволить операционной системе очищать ресурсы, чем вызывать все методы управления памятью. «. Это в значительной степени подтверждает то, что говорили многие люди.

0 голосов
/ 22 февраля 2011

С чего вы взяли, что dealloc не вызывали? Вы запускаете этот отладчик? Пожалуйста, посмотрите этот вопрос, почему вы не обязательно сможете вызывать NSLog в методе dealloc: когда выполняется dealloc?

...