我很好奇我是否正在使用CGImageRef跟踪正确的内存管理,我正在通过几种方法(因为它是CG对象,我认为它不支持自动释放)。非NSObjects的内存管理以及与其他NSObject的交互对我来说仍然有点新鲜。
我在做什么:
我正在使用CGBitmapContextCreateImage(保留计数1)在我的图像缓存管理器中创建CGImageRef,并将其添加到NSMutableDictionary(保留计数2)。
当CALayers使用图像时,我使用layer.contents(保留计数+1)进行分配,并在删除图层之前使用layer.contents = nil(保留计数-1)清除内容。
最后,在清除纹理时,我调用CGImageRefRelease和[NSMutableDictionary removeObject]使保留计数为0。
这是一种正确的方法吗?
答案 0 :(得分:17)
Core Foundation objects (which all Core Graphics objects are) do support autorelease.
您描述的步骤应该可以正常工作,不会泄漏或过度释放对象。
我使用CFRelease
而不是CGImageRelease
这样的特定类发布函数,但纯粹是风格问题。我只需要提防NULL
CGImageRelease
检查NULL
,而CFRelease
会在通过NULL
时崩溃。使用CGImageRelease
及其兄弟姐妹意味着您不必担心这一点。
我假设您的意思是removeObject:forKey:
,而不是removeObject
(它不存在,无论如何也无法指定对象)。