Как реализовать didReceiveMemoryWarning?

Я разработал простое местоположение осведомленное приложение для iPhone, которое функционально работает очень хорошо к нашим ожиданиям кроме низкого условия памяти телефона.

В низком условии памяти телефона просто отказывает мое приложение и Если я увеличиваю телефонную память путем освобождения некоторого пространства, это снова начинает работать хорошо без любого катастрофического отказа.

то, когда я сделал некоторый поиск с помощью Google на проблеме, я нашел, что в низкой памяти обусловливает ОС, отправит didReceiveMemoryWarning на все контроллеры в текущей иерархии так, чтобы каждый из них реализовал didReceiveMemoryWarning метод и также установить iboutlet на ноль для представления, которое в настоящее время не видимо.

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

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

Дайте надлежащий пример или ссылку, если это возможно, для решения вышеупомянутой проблемы.

спасибо.

49
задан Jason Whitehorn 14 February 2012 в 08:46
поделиться

5 ответов

Один пример, который я публикую ... который я скопировал откуда-то ... он может дать вам некоторое представление ...

- (void)didReceiveMemoryWarning {

    // Release anything that's not essential, such as cached data (meaning
    // instance variables, and what else...?)

    // Obviously can't access local variables such as defined in method
    // loadView, so can't release them here We can set some instance variables
    // as nil, rather than call the release method on them, if we have defined
    // setters that retain nil and release their old values (such as through use
    // of @synthesize). This can be a better approach than using the release
    // method, because this prevents a variable from pointing to random remnant
    // data.  Note in contrast, that setting a variable directly (using "=" and
    // not using the setter), would result in a memory leak.
    self.myStringB = nil;
    self.myStringD = nil;
    [myStringA release];// No setter defined - must release it this way
    [myStringC release];// No setter defined - must release it this way

    /* 3. MUST CONFIRM: NOT necessary to release outlets here - See override of
       setView instead.
    self.labelA = nil;
    self.imageViewA = nil;
    self.subViewA = nil;
     */
    // Releases the view if it doesn't have a superview
    [super didReceiveMemoryWarning];
}
21
ответ дан 7 November 2019 в 11:52
поделиться

Вам решать, что делать в didReceiveMemoryWarning . ОС сообщает вам, что памяти мало, и вам нужно как можно скорее освободить как можно больше памяти. Идея состоит в том, что вы должны освободить все кэшированные данные, выгрузить невидимые представления и т. Д. Детали зависят от приложения.

5
ответ дан 7 November 2019 в 11:52
поделиться

Вы также можете освободить память в didReceiveMemoryWarning , которую вы выделили для статических переменных в ваших классах. Потому что, как только память для статических переменных будет выделена, она не будет освобождена во время работы приложения.

4
ответ дан 7 November 2019 в 11:52
поделиться

К моему удивлению, только несколько приложений в официальных образцах iPhone реализуют didReciveMemoryWarning . Вы можете использовать пример iPhoneCoreDataRecipes в качестве справки.

Некоторые образцы (например, TableViewSuite) делают что-то еще; -)

2
ответ дан 7 November 2019 в 11:52
поделиться

Предупреждения о памяти - это сигнал для вас, что вы должны избавиться от любых ресурсов, которые не являются абсолютно критическими. Большинство ваших контроллеров будут зависать от кешей данных, промежуточных данных или других фрагментов, часто для экономии пересчета.Когда они получают предупреждения памяти, они должны начать очищать все, что им не нужно немедленно для работы.

Как вы определяете, что является «критическим», полностью зависит от дизайна вашего приложения. Например, игра OpenGL может определять, что текстуры, отображаемые в данный момент на экране, являются ценными, и сбрасывать текстуры, которые не видны, или данные уровня, которые находятся за пределами текущей игровой области. Приложение с обширными журналами сеансов (например, IRC-клиент) может сбрасывать их из памяти на диск.

Как вы заметили, предупреждение отправляется каждому контроллеру в вашей иерархии, поэтому каждая часть должна определять индивидуально, какие данные являются «критическими для работы», а какие - «расходными». Если вы оптимизировали их все и по-прежнему получаете предупреждения о нехватке памяти, к сожалению, пора пересмотреть дизайн вашего основного приложения, потому что вы превышаете ограничения оборудования.

15
ответ дан 7 November 2019 в 11:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: