UIViewController представление выгружается, даже когда видно - PullRequest
1 голос
/ 08 июля 2011

У меня контроллер вида A показывается модально поверх другого контроллера вида B внутри контейнера контроллера навигации.При моделировании предупреждений памяти, когда этот контроллер представления A отображается модально, я получаю сообщение didReceiveMemoryWarnings, как и ожидалось, а затем я получаю сообщение viewDidUnload, в результате чего представление моего контроллера представления A исчезает.

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

Вот трассировка стека, если она помогает точно определить проблему:

[UIViewController unloadViewForced:] ()

0x01458535 in - [UIViewController unloadViewIfReloadable] ()

0x01463eb8 in - [UINavigationController purgeMemoryForReason:] ()

0x01457b6d в - [UIVningEmb] (UWViewView)*

Спасибо за любую помощь!

Ответы [ 2 ]

1 голос
/ 08 июля 2011

Согласно http://developer.apple.com/library/ios/#documentation/UIKit/Reference/UIViewController_Class/Reference/Reference.html

Управление памятью

Память является критическим ресурсом в iOS, и контроллеры представления обеспечивают встроенный поддержка уменьшения их памяти след в критические моменты. Класс UIViewController предоставляет некоторые автоматическая обработка нехватки памяти условия через его Метод didReceiveMemoryWarning, который освобождает ненужную память До iOS 3.0, этот метод был единственным способом освободить дополнительную память, связанную с вашим собственным классом контроллера представления но в iOS 3.0 и более поздних Метод viewDidUnload может быть более подходящее место для большинства потребностей.

Когда появляется предупреждение о нехватке памяти, Класс UIViewController очищает его просмотров, если он знает, что может перезагрузить или воссоздайте их снова позже. Если это случается, это также вызывает метод viewDidUnload , чтобы дать свой код шанс отказаться от владения любые объекты, связанные с иерархия ваших представлений, включая объекты загружен с nib-файлом, объекты созданный в вашем методе viewDidLoad, и объекты, созданные лениво во время выполнения и добавлен в иерархию представлений. Как правило, если ваш вид контроллера содержит торговые точки (свойства или сырье переменные, которые содержат IBOutlet ключевое слово), вы должны использовать метод viewDidUnload для отказа владение этими точками или любой другие связанные с просмотром данные, которые вы не больше нужно.

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

0 голосов
/ 20 февраля 2013

Вы можете симулировать предупреждение о нехватке памяти из симулятора, выбрав Оборудование >> Имитация предупреждения о памяти.

А из IOS 6 при нехватке памяти viewDidUnload не будет вызываться. Поэтому вам нужно управлять тем, что может освободить всю память, переопределив предупреждение метода didreceivememory.

Важно понимать, что после viewDidUnLoad снова вызывается viewDidLoad. Таким образом, вы должны предположить, что viewDidLoad будет получать несколько раз в жизненном цикле ViewController.

Скажем, вы не используете дугу и выделяете массив, через некоторое время из-за нехватки памяти снова вызывается viewDidLoad, на этот раз вы снова создаете массив, чем он вызовет утечки памяти.

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