2009-08-12 5 views
3

Мне любопытно, если я следую правильному управлению памятью с помощью CGImageRef, с которым я проходил несколько методов (так как это объект CG, я полагаю, что он не поддерживает автоматическое оповещение). Управление памятью с помощью non-NSObjects и взаимодействие с другими NSObjects по-прежнему несколько нова для меня.Освобождение CGImage (CGImageRef)

Вот что я делаю:

Я создаю CGImageRef внутри моего образа диспетчера кэша с CGBitmapContextCreateImage (сохранить счетчик 1), и добавить его в NSMutableDictionary (сохранить счетчик 2).

Когда CALayers используют изображение, я назначаю его layer.contents (сохранить значение +1) и очищая содержимое с помощью layer.contents = nil (сохранить счет -1) перед удалением слоя.

Наконец, при очистке текстуры, я называю CGImageRefRelease и [NSMutableDictionary removeObject], чтобы сохранить счетчик как 0.

Является ли это правильный способ сделать это?

ответ

16

Core Foundation objects (which all Core Graphics objects are) do support autorelease.

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

Я использую CFRelease вместо функций освобождения определенного класса, таких как CGImageRelease, но исключительно как вопрос стиля. Я просто должен остерегаться NULL: CGImageRelease проверяет на NULL, тогда как CFRelease сбой при передаче NULL. Использование CGImageRelease и его братьев и сестер означает, что вам не нужно беспокоиться об этом.

Я предполагаю, что вы имели в виду removeObject:forKey:, а не removeObject (которого нет и не было бы где-нибудь указать объект).

+0

Спасибо за ссылку, отличный ресурс, многое разъясняет. В документах указано, что CGImageRelease не приведет к ошибке, если изображение NULL, поэтому звук более безопасный. removeObject: forKey :, да, это один. – Rudi

+0

** Документ, на который вы ссылаетесь, не поддерживает ваше требование. ** Некоторые объекты Core Foundation являются «бесплатными мостами» для классов Cocoa, но не для всех. Вы можете использовать 'CFStringRef' для' NSString * 'и наоборот, но вы не можете сделать это с помощью 'CGImageRef' и' UIImage'. – benzado

+0

Я утверждаю, что объекты CF поддерживают 'release' и' autorelease'. В этом документе явно сказано так: «Обратите внимание, что в примере, что функции управления памятью и методы также взаимозаменяемы, вы можете использовать« CFRelease »с объектом Cocoa и' release' и 'autorelease' с объектом Core Foundation.» Кроме того, Ссылка CGImage говорит о том, что CGImage спускается из CFType: http://developer.apple.com/iphone/library/documentation/GraphicsImaging/Reference/CGImage/ –