文档章节

Core Foundation

Ethan-GOGO
 Ethan-GOGO
发布于 2016/01/04 22:12
字数 746
阅读 66
收藏 1

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()方法,但是这种做法并不值得推荐。


© 著作权归作者所有

下一篇: Runtime
Ethan-GOGO
粉丝 14
博文 174
码字总数 82033
作品 0
广州
私信 提问
《从零开始学Swift》学习笔记(Day60)——Core Foundation框架

原创文章,欢迎转载。转载请注明:关东升的博客 Core Foundation框架是苹果公司提供一套概念来源于Foundation框架,编程接口面向C语言风格的API。虽然在Swift中调用这种C语言风格的API比较麻...

智捷课堂
2016/01/15
46
0
ARC中__bridge, __bridge__transfer, __bridge_retaine

多数情况下,Objective-C 对象和 Core Foundation 对象之间互相转换时, 我们都应该使用bridge。但是有时候我们确实需要给予 ARC 某个对象的所有权, 或者解除 ARC 对某个对象的所有权。这种情况...

lingfeng72
2015/11/24
35
0
Core Foundation 和 Foundation之间的转换

Core Foundation 和 Foundation之间的转换方式有三种,分别是:,,,这三种在使用上的区别为: :可以在不改变所有权的情况下,将对像的框架类型进行转换,所以在使用的时候,注意内存泄漏和悬...

iOS开发的毛毛虫
2017/11/28
0
0
iOS引用转换:Foundation与Core Foundation对象互相转换(__CFNSString转NSString,void *转id等等)

1. 两个框架的基本知识 1.1 Foundation 框架名是,在Xcode新建工程时可以选择导入(其实会默认自动依赖好)。Foundation框架允许使用一些基本对象,如数字和字符串,以及一些对象集合,如数组,...

陈满iOS
2018/05/10
0
0
IOS开发之__bridge,__bridge_transfer和__bridge_retained

from:http://blog.csdn.net/sanpintian/article/details/8139878 Core Foundation 框架 Core Foundation框架 (CoreFoundation.framework) 是一组C语言接口,它们为iOS应用程序提供基本数据管......

心如明镜
2014/02/26
0
0

没有更多内容

加载失败,请刷新页面

加载更多

浅谈prototype原型模式

一、原型模式简介 原型(Prototype)模式是一种对象创建型模式,他采取复制原型对象的方法来创建对象的实例。使用原型模式创建的实例,具有与原型一样的数据。 原型模式的特点: 1、由原型对...

青衣霓裳
18分钟前
6
0
shell mysql 备份

#!/bin/bash time2=$(date "+%Y-%m-%d-%H:%M:%S") /usr/local/mysql/bin/mysqldump -uroot -p ad > /usr/local/mysql/backup/"$time2".sql 变量引用原来是这么用的。......

奋斗的小牛
26分钟前
4
0
Jmeter监控Linux服务器操作

系统:Win7 64位 工具:Jmeter 4.0 要准备好的插件:JMeterPlugins-Standard-1.4.0,ServerAgent-2.2.1 解压JMeterPlugins-Standard-1.4.0.zip,将其中\lib\ext\JMeterPlugins-Standard.jar......

魔鬼妹子
26分钟前
5
0
系列文章:云原生Kubernetes日志落地方案

在Logging这块做了几年,最近1年来越来越多的同学来咨询如何为Kubernetes构建一个日志系统或者是来求助在这过程中遇到一系列问题如何解决,授人以鱼不如授人以渔,于是想把我们这些年积累的经...

Mr_zebra
27分钟前
5
0
入门必备!快速学会用Aspose.Words在表格中插入和删除列!

Aspose.Words For .Net(点击下载)是一种高级Word文档处理API,用于执行各种文档管理和操作任务。API支持生成,修改,转换,呈现和打印文档,而无需在跨平台应用程序中直接使用Microsoft W...

mnrssj
32分钟前
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部