你需要在Swift中释放CGContextRef吗?

18

我使用CGBitmapContextCreate创建了一个上下文。 我是否需要使用CGContextRelease释放它? 在Objective-C中,答案是肯定的,但在Swift中呢?

谢谢!


是的,在Swift中您需要遵循与Objective C相同的规则。 - sapi
谢谢!这是否意味着我也应该释放CGImageRef?我有以下两行代码: var imageRef = CGBitmapContextCreateImage(context); var image = UIImage(CGImage: imageRef)我是否也应该释放imageRef? - user2732722
@sapi 你确定他们遵循相同的规则吗?https://developer.apple.com/library/ios/documentation/Swift/Conceptual/BuildingCocoaApps/WorkingWithCocoaDataTypes.html - rakeshbs
我刚刚写了一个关于Swift的在线教程,涵盖了这个内容:http://www.apeth.com/swiftBook/apa.html#_cftyperefs - matt
1
@rakeshbs 我的错误;自从我上次使用它以来,情况似乎已经改变了(当时很少有API调用被注释)。 - sapi
显示剩余2条评论
2个回答

28
CFTypes会自动管理,除非明确指定为未管理。根据文档。 https://developer.apple.com/library/ios/documentation/Swift/Conceptual/BuildingCocoaApps/WorkingWithCocoaDataTypes.html 从带注释的API返回的Core Foundation对象在Swift中自动进行内存管理-您不需要自己调用CFRetain、CFRelease或CFAutorelease函数。如果您从自己的C函数和Objective-C方法返回Core Foundation对象,请使用CF_RETURNS_RETAINED或CF_RETURNS_NOT_RETAINED进行注释。编译器在编译调用这些API的Swift代码时自动插入内存管理调用。如果您仅使用不间接返回Core Foundation对象的已注释API,则可以跳过本节的其余部分。否则,请继续了解如何使用未管理的Core Foundation对象。
当Swift导入未被注释的API时,编译器无法自动进行返回的Core Foundation对象的内存管理。Swift将这些返回的Core Foundation对象包装在未管理的结构中。
未管理的类型将具有类型签名。
func StringByAddingTwoStrings(CFString!, CFString!) -> Unmanaged<CFString>!

CGBitmapContextCreate具有类型签名

func CGBitmapContextCreate(...) -> CGContext!

因此,它由Swift自动管理。

12

不,你不需要调用CGContextRelease。事实上,尝试这样做会导致以下错误:

'CGContextRelease'不可用:Core Foundation对象被自动内存管理。

CGContext实例在Swift中是自动内存管理的。你可以从函数签名看出来:

func CGBitmapContextCreate(/* several parameters */) -> CGContext!

你需要自己释放的返回值看起来像:

func CGBitmapContextCreate(/* several parameters */) -> Unmanaged<CGContext>!

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