在Swift中使用CGImageRelease

23

在Objc中,我在对图像进行处理后使用CGImageRelease方法。但是在Swift中,这种方法不可用。

在Apple的文档中,在保留和释放图像之后,有一个2个Objective-C符号隐藏

我的问题是,为什么Swift中没有CGImageRelease了?我们是否需要调用其他方法来替换它?

谢谢!

2个回答

56

CGImage现在由ARC管理。不再需要使用CGImageRelease()函数。您可以通过查看CGImage.h并注意到它包括宏CF_IMPLICIT_BRIDGING_ENABLED来了解此信息。这表明,苹果公司已经审核了此文件,以确保它符合内存管理命名约定,从而使ARC能够内存管理从该文件中返回的对象。


编辑:我重新阅读了一下这个内容,发现我有误导之嫌。我的意思并不是说在ObjC中不需要CGImageRelease函数(这基本上是我在这里暗示的...),我只是想说因为经过了审核,所以Swift可以处理它。在ObjC代码中,您仍然需要释放这些对象。


我有所怀疑。ARC引入了许多限制,这些限制在ObjC中很容易避免,但在C中却非常普遍。例如,您不能将受ARC管理的元素放入struct中。将ARC管理的元素作为void*传递也很棘手。苹果公司的重点是Swift,我怀疑他们会花很多时间来增强C语言。他们可能会倾向于将时间花在改进Swift上,以替代您在C中所做的任何事情。 - Rob Napier
如果不再需要使用 _CGImageRelease_,为什么每次使用 context.createCGImage 时内存使用量都会增加? - Hope
这取决于您的具体情况。请提出一个问题,附上能够重现您症状的代码和对您所看到的情况的详细描述。 - Rob Napier

1
在Swift中不再有CGImageRelease方法,也没有其他方法来替代它。
  • Swift只使用ARC,因此无法调用CFRelease或__bridge_retained。
  • 对于从C函数返回的类型,我们可以调用takeRetainedValue() / takeUnretainedValue()来获取Swift管理的值。
  • 使用宏CF_IMPLICIT_BRIDGING_ENABLED,打开Clang arc_cf_code_audited,Swift可以处理返回值的内存管理。
详情请参考:https://nshipster.com/unmanaged/

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接