Core Foundation

原创
2016/01/04 22:12
阅读数 139

Swift中的 Core Foundation 类型是一个成熟的类。当出现内存管理注释时,Swift 会自动地管理 Core Foundation 对象的内存,这其中包括你实例化了的 Core Foundation 对象。在 Swift 中,你可以自由变换 Fundation 和 Core Foundation 类型。如果你想先转换为桥接 Foundation 类型时,你也可以桥接一些 toll-free bridged Core Foundation 类型到 Swift 标准库类型。

重定义类型

当 Swift 导入 Core Foundation 类型时,编译器会重映射导入的类型名字。编译器会从每个类型名字的末端移除Ref,这是因为所有的 Swift 类都属于引用类型,因此后缀是多余的。

Core Foundation 中的CFTypeRef类型会对Anyobject类型重映射。所以你以前使用的CFTypeRef,现在该换成AnyObject了。

内存管理对象

在 Swift 中,从 annotated APIs 返回的 Core Foundation 对象能够自动进行内存管理--你不再需要调用自身的CFRetain,CFRelease,或者CFAutorelease函数。如果你从自身的C函数和 Objective-C 方法中返回一个 Core Foundation 对象,你需要用CF_RETURNS_RETAINED或者CF_RETURNS_NOT_RETAINED注释这个对象。当 Swift 代码中包含这些 APIs 时,编译器会在编译时自动调用内存管理。如果你只调用那些不会间接返回 Core Foundation 对象的 annotated APIs,那么现在你可以跳过本节的剩余部分了。否则,下面我们继续学习非托管的 Core Foundation 对象。

非托管对象

当 Swift 导入 unannotated 的APIs时,编译器将不会自动地对返回的 Core Foundation 对象进行内存管理托管。Swift 将这些返回的 Core Foundation 对象封闭在一个Unmanaged<T>结构中。那些间接返回 Core Foundation 的对象也是非托管的。举个例子,这里有一个 unannotated 的 C 函数:

CFStringRef StringByAddingTwoStrings(CFStringRef string1, CFStringRef string2)

这里说明了Swift是怎么导入的:

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

假设您从 unannotated APIs 接收了非托管的对象,在使用它之前,你必须将它转换为能够内存管理的对象。在这方面,Swift 可以帮你进行内存管理而不用自己动手。同时,Unmanaged<T>结构也提供了两个方法来把一个非托管对象转换为一个可内存管理的对象--takeUnretainedValue()方法和takeRetainedValue()方法。这两个方法会返回原始的,非封闭的对象类型。您可以根据您实际调用的APIs返回的unretained或retained的对象,来选择哪一方法更合适。

比如,假设这里有一个 C 函数,这个函数在返回值前不会释放CFString对象。在使用这个对象前,您使用takeUnretainedValue()函数,以将它转换为一个能够内存管理托管的对象。

let memoryManagedResult = StringByAddingTwoStrings(str1, str2).takeUnretainedValue()// memoryManagedResult is a memory managed CFString

您也可以在一个非托管的对象中使用retain(),release()和autorelease()方法,但是这种做法并不值得推荐。


展开阅读全文
打赏
0
1 收藏
分享
加载中
更多评论
打赏
0 评论
1 收藏
0
分享
返回顶部
顶部