viewDidUnload больше не вызывается в ios6

Я только что установил новую версию Xcode/ios6. viewDidUnload теперь устарел.

В яблочном документе

viewDidUnload [...] Устарело в iOS 6.0. Представления больше не очищаются при нехватке памяти, поэтому этот метод никогда не вызывается.

Но ряд приложений используют этот обратный вызов для раскрытия своих свойств, например:

- (void)viewDidUnload {
    [super viewDidUnload];

    self.recipientButton = nil;
    self.connectButton = nil;
    self.infoLabel = nil;
}

Это была лучшая практика для выпуска ваших IBOutlets.

Итак, первый вопрос:
Что произойдет с этими существующими приложениями в iOS 6? Будут ли они течь?

и второй:
Каков новый рекомендуемый способ освобождения свойства IBOutlet? В методе Dealloc?


person Martin    schedule 20.09.2012    source источник


Ответы (3)


По первому вопросу:

Ваш ViewController получит обратный вызов метода didReceiveMemoryWarning, и вы можете обнулить представление и другие компоненты в этом методе.

Для справки. Проверьте видеосессию WWDC 2012 на EVOLUTION OF VIEW CONTROLLER, если вы этого не сделали (я полагаю, что они доступны только для зарегистрированных разработчиков, но не уверен).

Ответь на твой второй.

[выпуск объекта]; в делелок. Нет необходимости присваивать nil объекту перед выпуском.

person Pranav Jaiswal    schedule 20.09.2012
comment
Спасибо за Ваш ответ. На самом деле, меня больше интересует первый вопрос. Но, как говорит stackoverflow.com/a/9281416/127493 (например, есть номера другой темы), IBOutlet свойства должны быть выпущены в viewDidUnload в соответствии с предыдущей передовой практикой. - person Martin; 20.09.2012
comment
Конечно, [object release]; в Dealloc возможно, только если вы не используете ARC. - person ; 10.10.2012
comment
Дословно из видео WWDC 2012 о контроллерах представлений: viewWillUnload и viewDidUnload. Мы больше не будем им звонить. Я имею в виду, есть своего рода уравнение затрат и выгод и анализ, который мы прошли. В первые дни у нас была реальная потребность в производительности, чтобы гарантировать, что при предупреждениях о памяти мы выгружали представления. Были всевозможные хранилища графики и фонограммы и так далее, которые также выгружались. Теперь мы выгружаем их независимо от представления, поэтому для нас не так уж важно, чтобы они были выгружены, и было так много ошибок, где были бы указатели на - person Rose Perrone; 03.01.2013
comment
выгруженные представления, которые не были очищены, что в конце дня мы не думали, что стоит автоматически вызывать их. Так что мы собираемся отказаться от этих методов. Вы все еще можете получить такое же поведение. Ваши контроллеры представления по-прежнему будут получать 'didReceiveMemoryWarning', и, если они захотят, они могут обнулить это представление. Он будет работать так, как ожидалось. Возможно, вы захотите сначала проверить, что ваш вид не находится в окне, прежде чем обнулить его. Я подчеркиваю это, потому что некоторые приложения фактически используют viewWillUnload, viewDidUnload как средство избавления от других ресурсов, которые не обязательно связаны с - person Rose Perrone; 03.01.2013
comment
представление само по себе, так что теперь этот код, возможно, придется перейти в didReceiveMemoryWarning. - person Rose Perrone; 03.01.2013
comment
Я обнаружил, что в некоторых случаях с iOS 6 резервные хранилища (например, представление контроллера представления) не выгружаются. Простым примером может быть повторная отправка нового экземпляра контроллера представления на контроллер навигации. В iOS 6 я видел, как свободная физическая память сокращалась примерно до 8 МБ, срабатывали предупреждения о нехватке памяти, и приложение не восстанавливало дополнительную память, прежде чем в конечном итоге было уничтожено ОС. Одно из решений состоит в том, чтобы проверить, загружено ли представление текущего контроллера представления и не отображается ли оно в didReceiveMemoryWarning, и выгрузить его/установить для него значение nil. - person Ari Braginsky; 22.02.2013
comment
Забавно, как IB до сих пор добавляет их в viewDidUnload при перетаскивании соединений между IB и исходными представлениями. - person Camsoft; 11.03.2013

Я рекомендую вам использовать слабое свойство для IBOutlets, например

@property (weak) IBOutlet UILabel * labelText;

Таким образом, вам не нужно ничего делать в Dealloc. В iOS 6 просто ViewDidUnload не будет вызываться, iOS5 или более ранние версии просто вызываются при возникновении предупреждения о памяти.

person Tomohisa Takaoka    schedule 20.09.2012

и второй: каков новый рекомендуемый способ выпуска свойства IBOutlet? В методе Dealloc?

Что такое «старый» рекомендуемый способ? Вы всегда должны освобождать сохраненные переменные экземпляра в dealloc; так было всегда и так будет.

Просто в viewDidUnload (который вызывается только при нехватке памяти) вы могли также установить для своих свойств значение nil.

person user102008    schedule 30.10.2012