Генерация предупреждения для пользователя, когда вызывается didReceiveMemoryWarning

Я видел некоторые приложения, которые генерируют предупреждение при обнаружении нехватки памяти. Я пытался сделать это в своем приложении, но столкнулся с проблемой. Используя симулятор для имитации предупреждения о памяти, сгенерированное предупреждение появляется дважды, прежде чем я могу нажать «ОК», и появляется еще 9 раз после этого раза, прежде чем оно, наконец, исчезнет.

Плохо ли генерировать предупреждение при вызове didReceiveMemoryWarning?

Если нет, есть ли лучший способ сделать это, чем то, что у меня ниже?

- (void)didReceiveMemoryWarning {

     [super didReceiveMemoryWarning];

     // Release any cached data, images, etc that aren't in use.
     ...

     UIAlertView *alert = [[UIAlertView alloc]
                          initWithTitle:@"Warning" 
                          message:@"Your device is low on memory..." 
                          delegate:nil 
                          cancelButtonTitle:@"OK" 
                          otherButtonTitles:nil];
    [alert show];
    [alert release];    
}

Спасибо,

Фил


person pirey4    schedule 02.01.2010    source источник


Ответы (3)


Вообще говоря, вы не должны уведомлять пользователя о нехватке памяти. В конце концов, что они могут сделать? Ваше приложение является приложением переднего плана, которое (помимо приложений Apple) потребляет большую часть памяти устройства. Что будет делать пользователь, когда увидит сообщение о памяти?

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

person Mike    schedule 02.01.2010

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

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

  1. Выделяйте элементы пользовательского интерфейса, когда они видны. Не скрывайте их, вместо этого удалите их из superView и снова назначьте их, когда они будут использоваться.
  2. Очистите весь кеш, когда возникает низкая нехватка памяти.
  3. Ограничьте область действия вашей переменной, когда это возможно. Все @property типа (Strong, keep, copy) будут оставаться активными до тех пор, пока ваш контроллер не будет освобожден.
  4. Найдите места потенциальной утечки с помощью статического анализатора.
  5. Найдите и устраните утечки с помощью инструментов Leak в инструментах. См. Поиск утечек в вашем приложении в Руководство пользователя инструментов.
  6. Используйте инструмент распределения, чтобы проверить, какая часть вашего приложения потребляет много памяти.
  7. Если вы используете классы Core Foundation? Убедитесь, что вы освобождаете каждое выделение вручную с помощью CFRelease.
  8. Убедитесь, что вы не создаете слишком много объектов autorelease за один раз. Если вы создаете, уменьшите объем, создав собственный AutoreleasePool, используя @autoreleasepool декларативный
person Sudhir kumar    schedule 07.04.2011

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

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

Это может быть более распространено на взломанных телефонах, где популярное приложение «backgrounder» позволяет запускать приложения в фоновом режиме (часто до тех пор, пока не произойдет это самое условие — в этот момент они будут принудительно закрыты — см. комментарий здесь, например).

Чтобы обойти проблему запуска события 11 раз подряд. Вы можете ограничить скорость всплывающего окна. Например: при отображении сохраните секунды с начала эпохи. Затем - проверьте, прошло ли определенное количество времени перед повторным отображением.

person user242275    schedule 02.01.2010
comment
Вариант использования, который вы описываете, - это то, что я пытаюсь выполнить. Некоторые пользователи со взломанными телефонами писали о сбое моего приложения. Если доступная память является проблемой, я хотел бы сообщить им об этом. Я последовал вашему предложению ограничить скорость предупреждений, переместив их из didReceiveMemoryWarning в каждом контроллере представления в общий метод в делегате приложения, где происходит ограничение скорости. (До меня не дошло, что причина, по которой я получал повторяющиеся предупреждения, была связана с вызовом didReceiveMemoryWarning во всех контроллерах представления одновременно, пока я не внес изменение.) Спасибо! - person pirey4; 03.01.2010