Предупреждения о памяти являются частью нормального поведения 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/