Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/35.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 发布CGImage(CGImageRef)_Iphone_Objective C_Core Graphics_Quartz Graphics - Fatal编程技术网

Iphone 发布CGImage(CGImageRef)

Iphone 发布CGImage(CGImageRef),iphone,objective-c,core-graphics,quartz-graphics,Iphone,Objective C,Core Graphics,Quartz Graphics,我很好奇我是否在使用CGImageRef进行适当的内存管理,我正在使用几种方法(因为它是CG对象,我假设它不支持自动释放)。使用非NSObjects进行内存管理以及与其他NSObjects的交互对我来说仍然有些陌生 下面是我正在做的: 我正在使用CGBitmapContextCreateImage在图像缓存管理器中创建CGImageRef(保留计数1),并将其添加到NSMutableDictionary(保留计数2) 当CALayers使用图像时,我使用layer.contents(保留计数+1

我很好奇我是否在使用CGImageRef进行适当的内存管理,我正在使用几种方法(因为它是CG对象,我假设它不支持自动释放)。使用非NSObjects进行内存管理以及与其他NSObjects的交互对我来说仍然有些陌生

下面是我正在做的:

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

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

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

这样做合适吗?

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

我使用了
CFRelease
而不是像
CGImageRelease
这样的特定类发布函数,但纯粹是出于风格的考虑。我只需要小心
NULL
CGImageRelease
检查
NULL
,而
CFRelease
在传递
NULL
时会崩溃。使用
CGImageRelease
及其同级意味着您不必担心这一点


我假设你的意思是
removeObject:forKey:
,而不是
removeObject
(它不存在,也没有地方指定对象)。

感谢链接,伟大的资源,澄清了很多。Docs提到,若图像为空,CGImageRelease不会导致错误,所以听起来更安全。removeObject:forKey:,是的,就是那个。您链接到的文档不支持您的声明。一些核心的基础对象是“免费桥接”可可类,但并非全部都是。您可以将
CFStringRef
强制转换为
NSString*
,反之亦然,但不能使用
CGImageRef
UIImage
强制转换。我的主张是,CF对象支持
release
autorelease
。该文档明确地表示:“从示例中注意到,内存管理功能和方法也是可互换的,您可以使用COCOA对象和<代码>发布< /COD>和<代码> AutoLeleS< <代码> >核心基础对象。CGIMAGE引用称CGImage从CFType下降:因此,简而言之,是的。我认为它指的是免费的桥接对象,它是CFType的一个子集,基于:“表1提供了在核心基础和基础之间可互换的数据类型的列表”。注意:并非所有数据类型都是免费桥接的,即使它们的名称可能表明它们是免费桥接的。例如,nsrunlop不是免费桥接到CFRunLoop的,NSBundle不是免费桥接到CFBundle的,NSDateFormatter也不是免费桥接到CFDateFormatter的。“你是说你可以将任何CFType强制转换到NSObject并自动释放它吗?