Почему я должен освобождать (и, следовательно, dealloc) объекты непосредственно перед закрытием приложения? - PullRequest
7 голосов
/ 07 октября 2009

В каждом приложении для iPhone есть множество объектов, которые будут жить вечно, пока приложение не умрет. Это: делегат приложения, окно, контроллер основного вида, может быть контроллер навигации или вкладки, все объекты внутри них. С какой стати я должен выпускать их перед тем, как прекратить тратить драгоценные циклы процессора? Насколько я понимаю, процесс приложения будет прерван, поэтому он будет кучным, согласованным или нет.

Так зачем мне их выпускать? Руководства Apple по разработке настаивают на этом, как в следующем примере кода (из Руководство по разработке iPhone ). Это просто первое место, где я нашел поиск по слову dealloc в библиотеке.

@implementation HelloWorldAppDelegate
@synthesize window;

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

    // Override point for customization after app launch
    MyView *view = [[MyView alloc] initWithFrame:[window frame]];
    [window addSubview:view];
    [view release];
    [window makeKeyAndVisible];
}
- (void)dealloc {
    [window release];
    [super dealloc];
}
@end

Из раздела обсуждений по NHObject-dealloc метод:

Обратите внимание, что при завершении приложения объекты не могут отправлять сообщение dealloc, поскольку память процесса автоматически очищается при выходе - эффективнее просто позволить операционной системе очистить ресурсы, чем вызвать все методы управления памятью. По этой и другим причинам вам не следует управлять дефицитными ресурсами в dealloc

Но метод dealloc в примере выше вызывается в текущей реализации, если ваше приложение достаточно быстро реагирует на applicationWillTerminate в течение 15 секунд.

Итак, еще раз. Следует ли мне избегать написания описанного выше метода dealloc для скорости выхода из приложения или есть проблемы с таким подходом?

Ответы [ 5 ]

6 голосов
/ 08 октября 2009

Потому что ты будешь знать, Артем.

Давайте поиграем в маленькую игру под названием «что если».

Что если , вы разрабатываете отличное приложение. Действительно мастерское приложение - и публика любит его! Ваши продажи растут, птицы поют твое имя в небе!

Но вы решили не делать ничего в вашем AppDelegate dealloc. Всего за несколько секунд вы решили не беспокоиться. В чем вред?

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

Квадратные формы, сначала нечеткие. Проходят дни, и они проясняются, так как вы спите все меньше и меньше Тогда, наконец, однажды, вы видите.

Это блоки, Артем. Блоки памяти . И что они делают во сне? Ну, вы видите, не совсем освобожденные от существования до выхода из приложения, они должны были куда-то идти. Приложение пропало, телефон перешел.

Итак, они перешли в вашу ГОЛОВУ . И каждый день прибывает больше, оставляя меньше места для СВОЙ .

Надеюсь, это было информативно ... Артем.

4 голосов
/ 08 октября 2009

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

Вы также вряд ли будете тратить свои драгоценные циклы ЦП (эти циклы, кстати, не настолько драгоценны, чтобы вы когда-либо заметили разницу. Эти анимации iPhone существуют в основном для того, чтобы выиграть время для запуска и закрытия приложения). вниз) потому что, когда приложение завершается, оно обычно не беспокоится о dealloc объектах, потому что, как вы говорите, дни выделения памяти в куче отстают от него.

Итак, да, dealloc вряд ли когда-либо будет вызван на UIApplicationDelegate, но стоит ли вам что-нибудь делать это в любом случае? Не совсем.

3 голосов
/ 08 октября 2009

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

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

0 голосов
/ 08 октября 2009

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

В нескольких местах документации Apple отмечает, что отказ от отправки dealloc при выходе - это намеренный выбор дизайна, поскольку, как вы сказали, гораздо эффективнее просто освободить все адресное пространство. См. Обсуждение по документам dealloc .

0 голосов
/ 07 октября 2009

Поскольку возможно, что у освобожденного класса есть побочный эффект, такой как сохранение состояния в его методе dealloc или в одном из его суперклассов. ОС не должно заботиться, она должна вернуть все ресурсы, несмотря ни на что.

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