Я в той части моего процесса разработки для отслеживания некачественных или утечек памяти. В качестве стратегии, вы вкладываете любые сообщения NSLog или уведомления о некоторых таких в didReceiveMemoryWarning:? Документация для этого метода является довольно редкой. Является ли это правильно сказать , что до аварии произойдет, то UIViewController будет вызывать этот метод? Это отправная точка , прежде чем даже идти вперед с инструментами?
IOS: услужливость из didReceiveMemoryWarning:
Хорошо, несколько вещей, чтобы отметить:
- didReceiveMemoryWarning будет вызываться перед сбоем из-за нехватки памяти. Не другие аварии. Если обрабатывать предупреждения должным образом и освободить память, то вы можете избежать состояния вне памяти и не врезаться.
- Вы можете вручную запустить предупреждение памяти в тренажере в меню Hardware. Очень рекомендую делать это, чтобы протестировать обработку didReceiveMemoryWarning.
- Инструменты помогают отлаживать утечки (хотя и не все из них) - это на самом деле не так уж полезно для аварий.
- Нет, я не использую NSLog - я просто останов предупреждения памяти, когда я отладку.
Если пользователь оставил некоторые приложения открыть у вас будет очень мало памяти в вашем распоряжении. Так что иногда didReceiveMemoryWarningможно назвать системой только после того, как 1 МБ использования.
Система вызывает этот метод на все контроллеры зрения, если вы размещаете NSLog в каждом из контроллеров просмотра, вы заметите, что.
Затем автоматически метод viewDidUnloadбудет вызываться системой на всех контроллерах зрения (не dealloc). Таким образом , вы должны поместить все ваши инструкции Deallocation там.
Вы должны сделать много экспериментов, потому что, если ваше приложение является сложным вы будете сталкиваться много аварий, прежде чем управлять им хорошо.
Не ОБНОВЛЕНИЕ
С IOS 6, UIViewControllerвид больше не выгружаются в ответ на предупреждения памяти. Вместо того, чтобы просто сделать все возможное , чтобы освободить любые ресурсы , которые можно разумно повторно создать (например , кэшированные данные) при didReceiveMemoryWarningвызове.
UPDATE
я написал оригинальный ответ , когда я был сердитым молодым человеком; Времена изменились , и в основном, это неправильно.
Если у вас есть приложение с помощью одного контроллера просмотра и вы получите предупреждение памяти, там не так много вы можете сделать. Но ситуация резко меняется , если у вас есть несколько контроллеров представлений, потому что вы можете выгрузить все состояние , связанное с не самым передними контроллерами. На самом деле [UIViewController didReceiveMemoryWarning]будет подталкивать вас в правильном направлении выгружать ваши без видимых для вас видом (сюрприз!). Когда контроллер представления самой передней уволен, основной вид перезагружается и в большинстве пользователь должен только знать о задержке , даже если внутренне ваше приложение может быть сделано полную перезагрузку.
Это не какая - то деталь можно легко модифицировать, вы должны держать использование памяти в виде с самого начала и создать свое приложение в множественном чисто незагружаемые UIViewControllerштуки. На самом деле это стоит держать ваш код совместим с симулятором просто использовать его предупреждение памяти функцию.
Когда память в изобилии, ничего не выгружается и все шелковистой, а при нехватке памяти вещи продолжают работать, хотя и более медленно. Теперь я бы сказал, что это решение конечной задачи памяти является идеальным.
Для того, чтобы воспользоваться этим гостиной памятью трюка, перегружать UIViewControllerметоды
viewDidLoad, viewDidUnloadи
viewWillUnload(iOS5, полезно , если выгрузка состояния требует вашего взгляда на все еще существует, например , если вы не хотите , чтобы просочиться вашей OpenGL текстуры и визуализации буфера, на iOS4 вы можете моделировать это из- за перегрузки didReceiveMemoryWarningи отслеживание видимости вашего вида).
ОРИГИНАЛ, MORE желчном ОТВЕТ
didReceiveMemoryWarning это абсолютно бесполезно.
Там нет никакой гарантии, что если освободить память (даже все это), что вы не будете убиты.
В моем горьком опыте он обычно работает, как это на 2.x / 3.0:
mediaserverd утечки кучу памяти
мое приложение получает убиты
К сожалению, жнец никогда не думает об убийстве mediaserverd.
Таким образом, если использование памяти не ваша вина, вы действительно только два варианта:
попросите пользователя перезагружать (пользователь принимает на себя это ваша вина, пишет уничтожающий обзор)
надеюсь, что виновник аварии (mediaserverd часто обязует!)
Цель didReceiveMemoryWarning, чтобы дать вам возможность освободить память или попы вида, чтобы избежать аварий. Вы не будете получать его в любой момент предсказуемой, потому что это зависит от того, что делает пользователь. Например, если пользователь слушает IPOD, меньше доступная память, и вы получите его раньше.
Общее правило заключается в том, что у вас есть около 8 МБ оперативной памяти для работы. Когда вы приблизитесь к тому, что вы можете ожидать, что события, которые будут подняты. Если вы принимаете вверх, что объем оперативной памяти сознательно вы должны иметь план, чтобы сделать что-то об этом.













