Это вопрос, состоящий из нескольких частей, в основном потому, что мое невежество по этому вопросу состоит из нескольких слоев.
Сначала я собрал систему кеширования для CGImageRef
объектов. Я держу его на уровне CGImageRef
(а не UIImage
), так как загружаю изображения в фоновых потоках. Когда изображение загружено, я помещаю его в NSMutableDictionary
. Мне нужно было немного выкрутить руку, чтобы получить CGImageRef
в массив:
//Bunch of stuff drawing into a context
CGImageRef imageRef = CGBitmapContextCreateImage(context);
CGContextRelease(context);
[(id)imageRef autorelease];
[self.cache setObject:(id)imageRef forKey:@"SomeKey"];
Итак, как вы можете видеть, я пытаюсь обработать ссылку на изображение как NSObject
, установив его на автоматический выпуск, затем поместив его в словарь. Я ожидаю, что это позволит очистить изображение после удаления из словаря. Теперь у меня начинаются сомнения.
Мое приложение очищает массив кеша, когда пользователь «перезагружается», чтобы поиграть с разными изображениями. Запуск приложения в Instruments показывает, что при перезапуске память не возвращается к «стартовому» уровню, а остается стабильной. Моя интуиция говорит мне, что когда массив удаляет все объекты, CGImageRef
не очищается.
Однако я не могу это подтвердить, так как не знаю, как отследить фактический источник памяти в инструментах. Это просто список (Malloc 16 байтов, Malloc 32 байтов и т. Д.), В них просто отображается список вызывающих вызовов dyld. Не уверен, как правильно его прочитать.
Итак, первый вопрос, является ли мой способ кэширования CGImageRef
объектов совершенно некорректным? И есть ли лучший способ подтвердить такие вещи в инструментах?