IOS 6 устаревание viewWillUnload & move to didReceiveMemoryWarning - программирование

IOS 6 устаревание viewWillUnload & move to didReceiveMemoryWarning

Я новый разработчик, чтобы запустить мое первое приложение. Я смущен насчет устаревания viewDidUnload, как описано ниже в примечаниях к выпуску Apple iOS 6:

В iOS 6 методы viewWillUnload и viewDidUnload UIViewController теперь устарел. Если вы использовали эти методы для выпуска данных используйте вместо этого метод didReceiveMemoryWarning. Вы также может использовать этот метод для публикации ссылок на представление контроллеры, если они не используются. Вам нужно будет проверить, что перед тем как это сделать, представление не находится в окне.

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

Спасибо.

4b9b3361

Ответ 1

Согласно Apple, они улучшили управление внутренней памятью для просмотров, что достигается за счет уничтожения материала в viewWill/DidUnload. Кроме того, у них есть данные, свидетельствующие о том, что многие приложения вылетают из строя, потому что приложения неправильно обрабатывают эти уведомления и делают "другие" вещи, не связанные с разгрузкой представления.

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

Итак, в основном, просто удалите ваши методы viewWillUnload и viewDidUnload. Устранение проблем с памятью в didReceiveMemoryWarning и любом другом диспетчере управления просмотром в соответствующих местах.

ИЗМЕНИТЬ

Могу я спросить: что это за "подходящие места"? Я использовал ViewdidUnload в некоторых ситуациях, когда вид [Will/Did] Disappear был не совсем адекватно. Как и дальше по навигации стек контроллера. Не могли бы вы подробнее остановиться на этом? - Dan1one

Это зависит. Я знаю, что не то, что вы хотите услышать, но это правда: -)

В общем, вам следует избегать асимметрии. Таким образом, вы должны "отменить" операцию, используя симметричный метод, из которого вы "сделали" оригинал. В общем, вы должны иметь возможность выполнять все операции типа viewDidUnload в didReceiveMemoryWarning и dealloc.

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

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

Одной из проблем с использованием viewDidDisappear и viewDidAppear было то, что было трудно понять, когда появилось представление, потому что оно действительно появлялось, или потому, что вид, который был поверх него, исчезал... вызывая он появится.

Эти части API должны помочь вам решить эти проблемы:

- (BOOL)isMovingFromParentViewController
- (BOOL)isMovingToParentViewController
- (BOOL)isBeingDismissed
- (BOOL)isBeingPresented

Ответ 2

В iOS 6 представления никогда не выгружаются.

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

Если вы хотите ответить на условия низкой памяти, выполните didReceiveMemoryWarning и отпустите свои временные данные и объекты в этом методе.

Ответ 3

В iOS 6 мы должны выпускать представления самостоятельно, делать что-то вроде этого

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];

    if([self isViewLoaded] && self.view.window == nil)
    {
        self.view = nil;
    }
}