你需要在 Swift 中发布 CGContextRef 吗?

Posted

技术标签:

【中文标题】你需要在 Swift 中发布 CGContextRef 吗?【英文标题】:Do you need to release CGContextRef in Swift? 【发布时间】:2015-01-10 04:22:12 【问题描述】:

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

谢谢!

【问题讨论】:

是的,您需要在 Swift 中遵循与在 Objective C 中相同的规则 谢谢!那么这是否意味着我也应该发布 CGImageRef?我有以下两行代码: var imageRef = CGBitmapContextCreateImage(context); var image = UIImage(CGImage: imageRef) 我还应该释放 imageRef 吗? @sapi 你确定他们遵循同样的规则吗? developer.apple.com/library/ios/documentation/Swift/Conceptual/… 我刚刚写了一个在线 Swift 教程,涵盖了这个:apeth.com/swiftBook/apa.html#_cftyperefs @rakeshbs 我的错;自从我上次玩这个之后,事情似乎发生了变化(当时很少有 API 调用被注释) 【参考方案1】:

CFTypes 是自动管理的,除非明确指定为 Unmanaged。 根据文档。 https://developer.apple.com/library/ios/documentation/Swift/Conceptual/BuildingCocoaApps/WorkingWithCocoaDataTypes.html

从带注释的 API 返回的 Core Foundation 对象会自动 Swift 中管理的内存——你不需要调用 CFRetain, CFRelease 或 CFAutorelease 函数自己。如果您返回核心 来自您自己的 C 函数和 Objective-C 方法的基础对象, 用 CF_RETURNS_RETAINED 或 CF_RETURNS_NOT_RETAINED。编译器自动插入内存 当它编译调用这些 API 的 Swift 代码时,管理调用。 如果您仅使用不间接返回 Core 的带注释的 API 基础对象,您可以跳过本节的其余部分。除此以外, 继续了解如何使用非托管核心基金会 对象。

当 Swift 导入未注解的 API 时,编译器 无法自动对返回的 Core Foundation 进行内存管理 对象。 Swift 将这些返回的 Core Foundation 对象包装在一个 非托管结构。

非托管类型将具有类型签名

func StringByAddingTwoStrings(CFString!, CFString!) -> Unmanaged<CFString>!

CGBitmapContextCreate 具有类型签名

func CGBitmapContextCreate(...) -> CGContext!

因此它由 swift 自动管理。

【讨论】:

【参考方案2】:

不,您无需致电CGContextRelease。事实上,试图给你这个错误:

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

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

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

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

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

【讨论】:

以上是关于你需要在 Swift 中发布 CGContextRef 吗?的主要内容,如果未能解决你的问题,请参考以下文章

你需要知道的swift必备函数 map

OC转Swift,你需要换个思考方式

如何在 Swift 中创建范围?

Quartz 2D:初识

如何实现OC与Swift混编

为啥你可以在 Swift 中为可选类型分配非可选值?