【问题标题】:Releasing CGImage (CGImageRef)释放 CGImage (CGImageRef)
【发布时间】:2009-08-12 00:14:57
【问题描述】:

我很好奇我是否正在使用 CGImageRef 进行正确的内存管理,我正在通过几种方法(因为它是 CG 对象,我假设它不支持自动释放)。非 NSObject 的内存管理以及与其他 NSObject 的交互对我来说还是有点新鲜。

这是我在做什么:

我正在使用 CGBitmapContextCreateImage(保留计数 1)在我的图像缓存管理器中创建 CGImageRef,并将其添加到 NSMutableDictionary(保留计数 2)。

当 CALayers 使用图像时,我使用 layer.contents(保留计数 +1)进行分配,并在删除图层之前使用 layer.contents = nil(保留计数 -1)清除内容。

最后,在清除纹理时,我调用 CGImageRefRelease 和 [NSMutableDictionary removeObject] 将保留计数设为 0。

这是正确的做法吗?

【问题讨论】:

    标签: iphone objective-c core-graphics quartz-graphics


    【解决方案1】:

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

    您描述的步骤应该可以正常工作,并且不会泄漏或过度释放对象。

    我使用CFRelease 而不是像CGImageRelease 这样的特定类发布函数,但纯粹是出于风格问题。我只需要提防NULLCGImageRelease 检查NULL,而CFRelease 在通过NULL 时会崩溃。使用CGImageRelease 和它的兄弟意味着你不必担心这个。

    我假设您的意思是 removeObject:forKey:,而不是 removeObject(它不存在,而且无论如何都没有指定对象的地方)。

    【讨论】:

    • 感谢您的链接,很棒的资源,澄清了很多。文档提到如果图像为 NULL,CGImageRelease 不会导致错误,因此听起来更安全。 removeObject:forKey:,是的,就是那个。
    • 您链接到的文档不支持您的声明。 一些 Core Foundation 对象是“免费桥接”到 Cocoa 类的,但并非全部都是。您可以将CFStringRef 转换为NSString *,反之亦然,但您不能对CGImageRefUIImage 执行此操作。
    • 我声称CF对象支持releaseautorelease。该文档明确表示:“请注意,内存管理函数和方法也是可以互换的——您可以将 CFRelease 与 Cocoa 对象一起使用,将 releaseautorelease 与 Core Foundation 对象一起使用。”此外,CGImage 参考说 CGImage 来自 CFType:developer.apple.com/iphone/library/documentation/…
    • 所以,简而言之,是的。
    • 我认为它指的是免费桥接对象,它是 CFType 的子集,基于:“表 1 提供了可在 Core Foundation 和 Foundation 之间互换的数据类型列表。”此外,在页面底部:“注意:并非所有数据类型都是免费桥接的,尽管它们的名称可能暗示它们是。例如,NSRunLoop 不是免费桥接的CFRunLoop,NSBundle 不是免费桥接到 CFBundle,NSDateFormatter 不是免费桥接到 CFDateFormatter。”你是说你可以将 any CFType 转换为 NSObject 并自动释放它?
    猜你喜欢
    • 1970-01-01
    • 2013-05-24
    • 1970-01-01
    • 1970-01-01
    • 2023-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多