15

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

谢谢!

4

2 回答 2

25

CFTypes 是自动管理的,除非明确指定为 Unmanaged。
根据文档。 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自动管理。

于 2015-01-10T04:37:18.747 回答
12

不,你不需要打电话CGContextRelease。事实上,试图给你这个错误:

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

CGContext实例在 Swift 中自动进行内存管理。您可以从函数签名中看出:

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

您需要释放自己的返回值如下所示:

func CGBitmapContextCreate(/* several parameters */) -> Unmanaged<CGContext>!
于 2015-01-10T04:43:26.017 回答