Выпуск CGImage (CGImageRef)
Мне любопытно, следую ли я правильному управлению памятью с помощью CGImageRef, который я пропускаю через несколько методов (так как это объект CG, я предполагаю, что он не поддерживает autorelease). Управление памятью с не-NSObjects и взаимодействие с другими NSObjects все еще несколько ново для меня.
Вот что я делаю:
Я создаю CGImageRef внутри моего менеджера кэша изображений с помощью CGBitmapContextCreateImage (оставьте счетчик 1) и добавляю его в NSMutableDictionary (оставьте счетчик 2).
Когда CALayers используют изображение, я назначаю с layer.contents (оставьте счетчик +1) и очищаю содержимое с помощью layer.contents = nil (оставьте счетчик -1) перед удалением слоя.
Наконец, при очистке текстуры я вызываю CGImageRefRelease и [NSMutableDictionary removeObject], чтобы сохранить значение 0.
Это правильный способ сделать это?
1 ответ
Базовые объекты Foundation (то есть все объекты Core Graphics) поддерживают авто-релиз.
Шаги, которые вы описываете, должны работать просто отлично, а не протекать или чрезмерно освобождать объект.
я использую CFRelease
вместо функций выпуска определенного класса, таких как CGImageRelease
, но чисто как вопрос стиля. Я просто должен остерегаться NULL
: CGImageRelease
проверяет NULL
, в то время как CFRelease
потерпит крах при прохождении NULL
, С помощью CGImageRelease
и его братья и сестры означает, что вам не нужно беспокоиться об этом.
Я предполагаю, что вы имели в виду removeObject:forKey:
не removeObject
(который не существует и в любом случае не будет где-то указывать объект).