【问题标题】:Rules for managing CGImageRef memory?管理 CGImageRef 内存的规则?
【发布时间】:2013-04-18 18:41:10
【问题描述】:

使用 ARC 为CGImageRefs 管理内存的规则是什么?也就是说,有人可以帮我找到正确的文档吗?

我正在从照片库中获取图像并创建一个UIImage 来显示:

CGImageRef newImage = [assetRep fullResolutionImage];
...
UIImage *cloudImage = [UIImage imageWithCGImage:newImage scale:scale orientation:orientation];

需要CGImageRelease(newImage)吗?

我收到内存警告,但它似乎不是我尚未释放的对象的逐渐堆积,而且我没有看到 Instruments 有任何泄漏。我很困惑。

【问题讨论】:

    标签: ios objective-c cocoa-touch automatic-ref-counting


    【解决方案1】:

    不,您不需要在ALAssetRepresentation 的便捷方法(如fullResolutionImagefullScreenImage)返回的CGImageRef 上调用CGImageRelease()。不幸的是,目前这些方法的文档和头文件并没有说明清楚。

    如果您使用CGImageCreate*() 函数之一自己创建CGImageRef,则您拥有它并负责使用CGImageRelease() 发布该图像引用。相比之下,fullResolutionImagefullScreenImage 返回的 CGImageRefs 似乎是“自动释放的”,因为您不拥有这些方法返回的图像引用。例如,假设您在代码中尝试这样的事情:

    CGImageRef newImage = [assetRep fullResolutionImage];
    ...
    UIImage *cloudImage = [UIImage imageWithCGImage:newImage
                            scale:scale orientation:orientation];
    CGImageRelease(newImage);
    

    如果您运行静态分析器,它将针对CGImageRelease(newImage); 行发出以下警告:

    不正确的对象的引用计数递减不正确 此时由调用者拥有

    请注意,无论您的项目设置为使用手动引用计数还是 ARC,您都会收到此警告。

    相比之下,NSBitmapImageRepCGImage 方法的文档,例如,使返回的 CGImageRef 是自动释放的事实更加清楚:

    CGImage

    从接收器返回一个 Core Graphics 图像对象 当前位图数据。

    - (CGImageRef)CGImage

    返回值

    根据接收者的信息返回一个自动释放的CGImageRef 不透明类型 当前位图数据。

    【讨论】:

    • 感谢您的周到回答。静态分析仪。记住要经常这样做。
    • 你只需要记住Core Foundation的内存管理规则。如果函数名中有“Create”,那么你管理它的内存;如果没有,那么你不会。
    猜你喜欢
    • 1970-01-01
    • 2011-03-12
    • 1970-01-01
    • 2011-01-09
    • 2011-06-01
    • 2021-08-26
    • 2021-11-21
    • 2011-11-22
    • 2017-02-16
    相关资源
    最近更新 更多