2014-11-20 2 views
2

У меня есть словарь SKTextures, который кэширует недавно загруженные текстуры (70 или около того). Я выпускаю их, когда предупреждение памяти получено, например:Освободите память при вводе фона

let keys = textures.keys.array 
for key in keys { 
    textures[key] = nil 
} 

Это прекрасно работает, и я могу видеть в Xcode отладчика, что память фактически освобожденного.

Когда я пытаюсь их освободить на applicationDidEnterBackground(), он не выглядит так, как будто он полностью работает. Использование памяти уменьшается с небольшим количеством непоследовательности (5-20 МБ), но остальная часть не освобождается, пока приложение не возобновится.

Это причуда с отладчиком и памятью is освобождается? Или у сборщика мусора не хватает времени для очистки до того, как приложение приостановлено? Или я делаю все это неправильно?

Обновление: Я уверен, что это связано с SpriteKit, автоматически приостанавливающим SKView при входе в фоновый режим. Это легко воспроизводится, приостанавливая просмотр вручную непосредственно перед выпуском текстур. Тогда память не будет освобождена даже при получении предупреждения о памяти.

+1

Сторона примечания: вы должны рассмотреть возможность использования 'NSCache' для этого. –

+0

У iOS нет сборщика мусора; управление памятью выполняется во время компиляции. Для получения дополнительной информации см. [Как работает новый механизм подсчета ссылок?] (Http://stackoverflow.com/q/6385212/3476191) – NobodyNada

+0

Я изменил его из Dictionary в NSCache, чтобы узнать, не изменилось ли это. Он работает отлично, но по-прежнему имеет такое же поведение при переходе на задний план. – Anterras

ответ

2

Является ли это причуда с отладчиком, и память будет освобождена

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

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

+0

Я вижу, что это так, но тогда почему бы это не случилось, когда память была выпущена без перехода на задний план? – Anterras

+0

Независимо от того, я написал другое приложение, которое непрерывно загружает изображения (я позволяю ему работать до тех пор, пока в памяти не будет около 2 ГБ), но использование первого приложения не снизилось. Сколько памяти требуется второму приложению, прежде чем я увижу изменение? – Anterras

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