iOS: любезность didReceiveMemoryWarning:

Почему вам нужно заблокировать стол во время создания? Я не думаю, что это может быть сделано в SQL Server. вам нужно внести некоторые изменения в свое приложение.

12
задан Coocoo4Cocoa 2 October 2012 в 08:21
поделиться

3 ответа

Хорошо, несколько вещей отметить:

  • didReceiveMemoryWarning назовут перед катастрофическим отказом из памяти. Не другие катастрофические отказы. Если Вы обрабатываете предупреждение правильно и свободный память, то можно избежать условия из памяти и не катастрофического отказа.
  • Можно вручную инициировать предупреждение памяти в средстве моделирования в соответствии с меню Hardware. Настоятельно рекомендуйте выполнение этого для тестирования обработки didReceiveMemoryWarning.
  • Инструменты помогают Вам отладить утечки (хотя не все они) - это не действительно настолько полезно для катастрофических отказов.
  • Нет, я лично не использую NSLog - я просто устанавливаю контрольные точки предупреждения памяти, когда я отлаживаю.
28
ответ дан 2 December 2019 в 03:39
поделиться

Цель didReceiveMemoryWarning состоит в том, чтобы дать Вам шанс свободной памяти или поп-представлениям для предотвращения катастрофического отказа. Вы не получите его ни в какой предсказуемой точке, потому что это зависит от того, что делает пользователь. Например, если пользователь слушает iPod, существует менее доступная память, и Вы получите его раньше.

Общее эмпирическое правило - то, что у Вас есть приблизительно 8 МБ RAM для работы с. Когда Вы рядом, до которого можно ожидать, что событие будет повышено. При приведении в рабочее состояние так большого количества RAM сознательно, у Вас должен быть план делать с этим что-то.

3
ответ дан 2 December 2019 в 03:39
поделиться

ОБНОВЛЕНИЕ Начиная с iOS 6, представления UIViewController больше не выгружаются в ответ на предупреждения памяти. Вместо этого просто сделайте все возможное, чтобы освободить любые ресурсы, которые вы можете разумно воссоздать (например, кэшированные данные), когда вызывается didReceiveMemoryWarning .

ОБНОВЛЕНИЕ
Я написал свой первоначальный ответ, когда был разгневанным молодым человеком; времена изменились, и в основном это неправильно.

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

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

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

Чтобы воспользоваться этим трюком с памятью, перегрузите методы UIViewController viewDidLoad,viewDidUnload, and viewWillUnload (iOS5, useful if unloading state requires your view to still exist, e.g. if you don't want to leak your OpenGL textures & render buffer, on iOS4 you can simulate this by overloading didReceiveMemoryWarning and tracking your view's visibility).

ORIGINAL, MORE BILIOUS ANSWER

didReceiveMemoryWarning is absolutely useless.

There's no guarantee that if you free up memory (even all of it) that you won't get killed.

In my bitter experience it usually works like this on 2.x/3.0:

  1. mediaserverd leaks a bunch of memory

  2. my app gets killed

Unfortunately, the reaper never thinks of killing mediaserverd.

So if the memory usage isn't your fault, you've really only got two choices:

  1. ask the user to reboot (user assumes it's your fault, writes a scathing review)

  2. hope the culprit crashes (mediaserverd often obliges!)

5
ответ дан 2 December 2019 в 03:39
поделиться
Другие вопросы по тегам:

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