2015-09-12 2 views
2

У меня есть некоторые общие вопросы о том, что происходит с памятью приложения.iOS Управление памятью (утечки, удержание циклов)

  1. Что происходит с памятью, когда приложение входит в фоновый режим или приостановлено. Я спрашиваю об этом, потому что у моего приложения есть некоторые утечки памяти, которые из моих исследований, ошибок в структуре Apple, а не из-за моей кодировки. Утечки довольно малы (~ 100 байт), поэтому они не должны нарушать производительность. Однако мне было интересно, что происходит с этими утечками, когда пользователь перестает использовать приложение? Они уходят или просто остаются навсегда в памяти телефона?

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

Итак, если пользователь закрывает приложение, делайте выделение и память сбрасывается на 0, это то, что я пытаюсь задать.

Благодарим за помощь!

ответ

4

Ответ сложный.

Приложение может находиться в различных состояниях:

Active 
Inactive 
Running in the background 

Suspended 

Not running 

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

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

Ожидается сохранение любой информации, необходимой для сохранения в ответ на сообщение applicationDidEnterBackground.

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

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

Как отмечает @blobbfuesch, утечка памяти заставляет ваше приложение использовать все больше и больше ОЗУ устройства. Если ваше использование памяти становится слишком большим, система выдаст вам одно или несколько предупреждений о памяти, и если вы не освободите достаточное количество памяти, оно прекратит вас.

Потому что утечка памяти потеряна, вы НЕ МОЖЕТЕ освободите ее. Даже небольшие утечки складываются. Если пользователь сохраняет вашу активность достаточно долго, они накапливаются и могут привести к прекращению действия вашего приложения, которое выглядит как сбой для пользователя.

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

+0

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

+0

Я почти уверен, что инструмент «Утечки» имеет флаг сохранения циклов. Вы обнаружили другие утечки, о которых вы говорите в симуляторе или на устройстве? За эти годы я видел несколько случаев утечек памяти в системных рамках, которые появляются только в симуляторе. (Предположительно вызвано ошибками в моделируемой реализации системных фреймворков.) –

+0

Я нашел другие утечки на устройстве. Когда я пытаюсь использовать инструменты на симуляторе, он сильно зависает/отстает от моего Mac-mini (я не уверен, почему), но он не отстает от моего устройства почти так же плохо –

2
  1. Если ваше приложение входит в фон, iOS не изменит вашу память приложений, а сообщит вашему приложению о выпуске памяти, поскольку новая память необходима, отправив предупреждения о памяти. Большинство рамок яблок, которые вы используете в своем приложении, таких как UIKit и MapKit, также выпускаете память в этом случае.

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

  2. Поскольку вся память освобождается при прекращении действия приложения, сохраняются циклы, когда приложение завершается. однако, если вы запустите его снова и тот же код будет выполнен, ваше приложение снова создаст тот же цикл сохранения.
+0

Спасибо за ваш ответ. Как бы вы посоветовали найти циклы сохранения? Я считаю, что они не показаны в Инструменте утечек. –

+0

1. Первое предложение неверно. Приложение в фоновом режиме или приостановлено не выпустило какую-либо из его памяти. Это происходит только тогда, когда процесс приложения полностью завершен. – rmaddy

+0

@rmaddy Я заметил, что приложение, которое я создал, освобождает все больше и больше ресурсов в фоновом режиме, не прерываясь. Этот процесс происходит не сразу, но это произойдет, поскольку для приложений на переднем плане требуется больше памяти. – Palle

Смежные вопросы