didReceiveMemoryWarning (в iOS 3.0+) - PullRequest
1 голос
/ 21 мая 2011

Посмотрите документацию для didReceiveMemoryWarning:

http://developer.apple.com/library/ios/#documentation/uikit/reference/UIViewController_Class/Reference/Reference.html

Обратите внимание, как говорится, и я цитирую:

В iOS 3.0 и более поздних версиях, если на ваш взгляд контроллер содержит ссылки на объекты в иерархии представлений вы должны выпустить эти ссылки в Вместо этого используйте метод viewDidUnload. В ранние версии iOS, вы должны продолжать освобождать их от этого способ.

Почему это так? Что изменилось в iOS 3.0, что сделало так, что представления иерархии представлений не должны очищаться непосредственно в didReceiveMemoryWarning? Я не могу представить, что может сделать это опасным или плохим.

Есть идеи, ребята?

1 Ответ

1 голос
/ 21 мая 2011

В iOS 3.0 viewDidUnload и viewDidLoad были введены.

Если вы посмотрите на их описание, вы увидите, что:

viewDidLoad вызывается после того, как контроллер представления загрузил связанные виды в память. Этот метод вызывается независимо от того, были ли представления сохранены в файле пера или созданы программно в методе loadView.

Это означает, что как при загрузке вашего представления из Nib, так и когда вы создаете его программно (и фреймворк запрашивает вас в нужный момент loadView), у вас есть единственная точка, где вы можете получить доступ к вашему новому просмотреть и завершить его инициализацию, например, добавить подпредставления или все, что вам нужно.

Аналогом viewDidLoad является viewDidUnload, который вы можете переопределить следующим образом:

-(void)viewDidUnload {
     <do all the necessary clean up>
    [super viewDidUnload];
}

Итак, у вас есть одна единственная точка для очистки, и вам не нужно выполнять какую-либо определенную очистку в didReceiveMemoryWarning, потому что viewDidUnload вызывается всякий раз, когда представление освобождается, т. Е. Также когда оно освобожден из-за didReceiveMemoryWarning.

Это отличается от того, что происходило ранее с iOS 3.0, где вам приходилось предлагать собственную схему завершения инициализации и очистки без поддержки со стороны платформы, т. Е. Когда didReceiveMemoryWarning вызвало освобождение представления, ваш метод очистки не был вызван автоматически, и вам пришлось продублировать код очистки (и выполнить очистку явно в didReceiveMemoryWarning).

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