你需要在 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 吗?的主要内容,如果未能解决你的问题,请参考以下文章