2010-05-24 2 views
0

Я вводил автоматическое вращение в свое приложение, и у меня возникла проблема с предупреждением о памяти. Независимо от ориентации, я запускаю свое приложение, пока устройство остается в этой ориентации, я не получаю никаких предупреждений о памяти. Однако при первом повороте устройства на консоль помещается следующее предупреждение: Safari получил предупреждение о уровне памяти, убив все документы, кроме активных. Когда это происходит, все диспетчеры представлений, отличные от того, которые просматриваются, выгружаются - это приводит к неожиданному поведению при навигации назад для просмотра контроллеров, которые обычно должны быть в стеке. Приложение никогда не сбой, и это предупреждение происходит один раз при первом повороте, после чего это никогда не происходит (пока я не остановлю/не запустил приложение снова). Кроме того, это происходит только на устройстве - при запуске в симуляторе предупреждение о сохранении памяти отсутствует.Вращение iPhone вызывает предупреждение памяти

Кто-нибудь видел это поведение? В любом случае, есть ли у кого-нибудь предложения о том, что я могу попробовать, чтобы удалить предупреждение о памяти.

Заранее спасибо.

ответ

2

Вы не можете предполагать, что предупреждения о памяти никогда не произойдут; вы должны обрабатывать их изящно. Предложения:

  • Проверьте на наличие утечек памяти с утечками (обратите внимание, что он не улавливает все утечки).
  • Исправьте контроллеры просмотра, чтобы обработать просмотр. В частности (если вы не переопределите - (void) loadView), он вызовет - (void) viewDidUnload в предупреждении памяти и - (void) viewDidLoad, когда он снова станет видимым. Вы можете исправить это, сохранив состояние в контроллере представления и восстановив его в представлениях в (void) viewDidLoad.
  • Если вы не можете беспокоиться об обращении с предупреждением о памяти, выполните - (void) didReceiveMemoryWarning и не выполняйте супервызов (например, комментарий [super didReceiveMemoryWarning]). Это лениво и может привести к сбою, если ваше приложение закончится с использованием слишком большого объема памяти (сначала будут уничтожены фоновые приложения, такие как Safari и Phone).

Вы можете проверить поведение предупреждений памяти с помощью опции «имитировать память» в симуляторе.

0

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

UIKit не только позволяет осуществлять навигацию с контроллера просмотра, но также позволяет осуществлять навигацию к другим контроллерам представлений от существующих. В этом случае новый UIViewController будет выделен, а затем загружен в поле зрения. Старый контроллер представлений отключится и станет неактивным, но все еще владеет многими объектами - некоторыми в пользовательских свойствах и переменных и другими в представлении/иерархии представления. Так же как и новый видимый контроллер вида, в отношении его объектов вида.

Из-за ограниченного объема памяти мобильных устройств владение двумя наборами объектов - одним в контроллере внешнего экрана и другим в контроллере на экране - может быть слишком много, чтобы справиться. Если UIKit считает это необходимым, он может вернуть часть памяти контроллера вне экрана, которая пока не показана; UIKit знает, какой контроллер просмотра находится на экране, а который вне экрана, в конце концов, он управляет ими (когда вы вызываете presentModalViewController: анимированный: или rejectModalViewControllerAnimated :). Таким образом, каждый раз, когда он чувствует давление, UIKit генерирует предупреждение о памяти, которое выгружает и освобождает неэкранное представление из иерархии представлений, а затем вызывает ваш собственный метод viewDidUnload для того, чтобы вы делали то же самое для своих свойств и переменных. UIKit автоматически запускает self.view, позволяя нам вручную выпустить наши переменные и свойства в нашем коде viewDidUnload. Это делается для всех контроллеров без экрана.

Когда система исчерпала память, она запускает makeReceiveMemoryWarning.Вне экрана будут восстановлены и выпущены после предупреждения о памяти, но ваш экранный вид не будет выпущен - он виден и необходим. Если ваш класс владеет большой памятью, например кешами, изображениями и т. Д., DoReceiveMemoryWarning - это то, где вы должны их очистить, даже если они находятся на экране; в противном случае ваше приложение может быть прервано для использования системных ресурсов. Вам необходимо переопределить этот метод, чтобы очистить память; просто помните, что вы называете [super didReceiveMemoryWarning] ;.

Более подробные пояснения можно найти здесь: http://myok12.wordpress.com/2010/11/30/custom-uiviewcontrollers-their-views-and-their-memory-management/