UPDATE
Начиная с iOS 6, UIViewController
представления больше не выгружаются в ответ на предупреждения памяти. Вместо этого просто делайте все возможное, чтобы освободить любые ресурсы, которые вы можете разумно воссоздать (например, кэшированные данные), когда вызывается didReceiveMemoryWarning
.
UPDATE
Я написал свой оригинальный ответ, когда был сердитым молодым человеком; времена изменились и в основном это неправильно.
Если у вас есть приложение с одним контроллером представления и вы получаете предупреждение о памяти, вы ничего не можете сделать. Но все меняется кардинально, если у вас есть несколько контроллеров представления, потому что вы можете выгрузить all состояние, связанное с внешними контроллерами. На самом деле [UIViewController didReceiveMemoryWarning]
будет подталкивать вас в правильном направлении, выгружая ваши невидимые виды для вас (сюрприз!). Когда контроллер самого переднего вида отклоняется, базовый вид перезагружается, и самое большее пользователь должен знать только о задержке, даже если внутренне ваше приложение могло выполнить полную перезагрузку.
Это не та деталь, которую вы можете легко модернизировать, вам нужно помнить об использовании памяти с самого начала и спроектировать ваше приложение с несколькими окнами на чисто выгружаемые UIViewController
кусочки. На самом деле стоит сохранить ваш код совместимым с симулятором, чтобы использовать функцию предупреждения о памяти.
Когда памяти много, ничего не выгружается и все гладко и гладко, а когда памяти мало, все работает, хотя и медленнее. Теперь я бы сказал, что это решение проблемы конечной памяти идеально.
Чтобы воспользоваться этим трюком с памятью, перегрузите методы UIViewController
viewDidLoad
, viewDidUnload
и
viewWillUnload
(iOS5, полезно, если состояние выгрузки требует, чтобы ваше представление все еще существовало, например, если вы не хотите пропускать текстуры OpenGL и буфер рендеринга, на iOS4 вы можете смоделировать это, перегружая didReceiveMemoryWarning
и отслеживая видимость вашего представления) ,
ОРИГИНАЛ, БОЛЬШЕ БИЛИОЗНОГО ОТВЕТА
didReceiveMemoryWarning
абсолютно бесполезен.
Нет гарантии, что если вы освободите память (даже всю)
что тебя не убьют.
В моем горьком опыте это обычно работает на 2.x / 3.0:
mediaserverd пропускает кучу памяти
мое приложение убивают
К сожалению, жнец никогда не думает об убийстве медиасервера.
Так что, если использование памяти не ваша ошибка, вы действительно только получили
два варианта:
попросить пользователя перезагрузиться (пользователь полагает, что это ваша вина, пишет обзор)
надеюсь, что виновник падает (mediaserverd часто обязывает!)