У меня есть словарь SKTextures, который кэширует недавно загруженные текстуры (70 или около того). Я выпускаю их, когда предупреждение памяти получено, например:Освободите память при вводе фона
let keys = textures.keys.array
for key in keys {
textures[key] = nil
}
Это прекрасно работает, и я могу видеть в Xcode отладчика, что память фактически освобожденного.
Когда я пытаюсь их освободить на applicationDidEnterBackground(), он не выглядит так, как будто он полностью работает. Использование памяти уменьшается с небольшим количеством непоследовательности (5-20 МБ), но остальная часть не освобождается, пока приложение не возобновится.
Это причуда с отладчиком и памятью is освобождается? Или у сборщика мусора не хватает времени для очистки до того, как приложение приостановлено? Или я делаю все это неправильно?
Обновление: Я уверен, что это связано с SpriteKit, автоматически приостанавливающим SKView при входе в фоновый режим. Это легко воспроизводится, приостанавливая просмотр вручную непосредственно перед выпуском текстур. Тогда память не будет освобождена даже при получении предупреждения о памяти.
Сторона примечания: вы должны рассмотреть возможность использования 'NSCache' для этого. –
У iOS нет сборщика мусора; управление памятью выполняется во время компиляции. Для получения дополнительной информации см. [Как работает новый механизм подсчета ссылок?] (Http://stackoverflow.com/q/6385212/3476191) – NobodyNada
Я изменил его из Dictionary в NSCache, чтобы узнать, не изменилось ли это. Он работает отлично, но по-прежнему имеет такое же поведение при переходе на задний план. – Anterras