CGImage, NSArray и Память - PullRequest
       8

CGImage, NSArray и Память

2 голосов
/ 20 декабря 2010

Это вопрос, состоящий из нескольких частей, в основном потому, что мое невежество по этому вопросу состоит из нескольких слоев.

Сначала я собрал систему кеширования для 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 объектов совершенно некорректным? И есть ли лучший способ подтвердить такие вещи в инструментах?

Ответы [ 2 ]

1 голос
/ 20 декабря 2010

Прежде всего, кэширование CGImages в порядке, и я не вижу никаких проблем с кодом, который вы разместили.

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

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

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

0 голосов
/ 20 декабря 2010

Почему бы просто не кэшировать объекты UIImage; Вы можете сделать их хорошо на фоне потока?

Это объекты UIImageView, с которыми вам следует быть более осторожными, и даже они подходят для большинства операций в фоновом режиме.

...