iOS - Управление памятью: куда уходит вся эта память? - PullRequest
1 голос
/ 19 сентября 2011

У меня довольно простое приложение, которое я обновляю - и в рамках обновления я реализую управление предупреждениями памяти.

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

Что не работает:

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

1 - запустить приложение - это оригинальный скачок памяти, показанный ниже.

2 - добавить новый контроллер вида - это второй всплеск.

3 - Вернитесь к контроллеру основного вида и смоделируйте предупреждение аппаратной памяти - это (небольшое) падение памяти ближе к концу. Это предупреждение должно полностью освободить дополнительный контроллер вида и связанные с ним объекты.

enter image description here

  • Несмотря на то, что все освобождено, остается много памяти. Насколько я могу судить, это что-то вроде кэшированной анимации и т. Д., Что делает iOS. В реальной ситуации с нехваткой памяти, это должно быть освобождено, и не останавливаться, поскольку это - то, куда большая часть памяти уходит.

Как освободить эту память - или что я делаю не так? Любые указатели будут высоко оценены - спасибо!

-

РЕДАКТИРОВАТЬ: Спасибо за все ответы до сих пор! Хотя, к сожалению, я до сих пор не смог решить проблему. Кроме того, странность памяти возникает только при использовании контроллеров модального представления.

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

Я мог бы потенциально создать мини-проект, который демонстрировал бы поведение, если бы это помогло. Спасибо:)

Ответы [ 2 ]

2 голосов
/ 19 сентября 2011

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

Вы должны проверить http://developer.apple.com/videos/wwdc/2010/. Чтобы быть конкретным http://developer.apple.com/videos/wwdc/2010/?id=311.

2 голосов
/ 19 сентября 2011

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

Allocating & deallocating

EDIT

Чтобы ответить на ваши комментарии: UIViewController принадлежит UIKit и не является потокобезопасным, что означает, что вы не должны создавать его в фоновом потоке. Это может быть причиной утечки памяти, поскольку она не будет добавлена ​​в основной пул автоматического выпуска.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...