文档章节

Swift中 core Foundation的运用

richard_YM
 richard_YM
发布于 2016/11/17 14:25
字数 984
阅读 28
收藏 0

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

1.重定义类型

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

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

2.内存管理对象

在 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 对象。

3.非托管对象

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

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

unmanaged 为未被管理的类型

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

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

unmanaged 未被管理

 let firstName =  ABRecordCopyValue(person, kABPersonFirstNameProperty).takeRetainedValue()

Paste_Image.png

Paste_Image.png 这样的话 你就可以把这个属性转换成任意类型了。

下边说一下ios9 新出的 ContactsUI 来代替 AddressBookUI 太简单了。这个就是面对对象来操作的。

首先设置属性以及代理。以及遵守协议。

viewController: UIViewController,CNContactPickerDelegate {

    override func viewDidLoad() {
        super.viewDidLoad()

        let vc = CNContactPickerViewController()
        vc.delegate = self
        self.presentViewController(vc, animated: true, completion: nil)
        

然后实现代理方法。

func contactPicker(picker: CNContactPickerViewController, didSelectContact contact: CNContact) {
        
        let name = contact.familyName
        print(name)
    }

contact 装的都是对象属性。 哪里不会点哪里

   public var identifier: String { get }
    
    public var contactType: CNContactType { get }
    
    public var namePrefix: String { get }
    public var givenName: String { get }
    public var middleName: String { get }
    public var familyName: String { get }
    public var previousFamilyName: String { get }
    public var nameSuffix: String { get }
    public var nickname: String { get }
    
    public var phoneticGivenName: String { get }
    public var phoneticMiddleName: String { get }
    public var phoneticFamilyName: String { get }
    
    public var organizationName: String { get }
    public var departmentName: String { get }
    public var jobTitle: String { get }
    
    public var note: String { get }
    
    @NSCopying public var imageData: NSData? { get }
    @NSCopying public var thumbnailImageData: NSData? { get }
    @available(iOS 9.0, *)
    public var imageDataAvailable: Bool { get }
    
    public var phoneNumbers: [CNLabeledValue] { get }
    public var emailAddresses: [CNLabeledValue] { get }
    public var postalAddresses: [CNLabeledValue] { get }
    public var urlAddresses: [CNLabeledValue] { get }
    public var contactRelations: [CNLabeledValue] { get }
    public var socialProfiles: [CNLabeledValue] { get }
    public var instantMessageAddresses: [CNLabeledValue] { get }
    
    /*! The Gregorian birthday. */
    @NSCopying public var birthday: NSDateComponents? { get }
    
    /*! The alternate birthday (Lunisolar). */
    @NSCopying public var nonGregorianBirthday: NSDateComponents? { get }
    ```  
是不是比core foundation爽多了???

© 著作权归作者所有

richard_YM
粉丝 0
博文 18
码字总数 12866
作品 0
私信 提问
Core Foundation

Swift中的 Core Foundation 类型是一个成熟的类。当出现内存管理注释时,Swift 会自动地管理 Core Foundation 对象的内存,这其中包括你实例化了的 Core Foundation 对象。在 Swift 中,你可...

Ethan-GOGO
2016/01/04
66
0
《从零开始学Swift》学习笔记(Day60)——Core Foundation框架

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

智捷课堂
2016/01/15
46
0
IBM公布Kitura 1.0和Bluemix Runtime for Swift 3

Swift 3正式公布几天后,IBM就已发布了自家的开源服务器端Kitura框架1.0版,以及IBM Bluemix Runtime for Swift 3。InfoQ就服务器端的Swift发展情况采访了IBM的Chris Bailey。 为了兑现改善服...

达尔文
2016/10/15
993
0
《从零开始学Swift》学习笔记(Day 61)——Core Foundation框架之内存管理

原创文章,欢迎转载。转载请注明:关东升的博客 在Swift原生数据类型、Foundation框架数据类型和Core Foundation框架数据类型之间转换过程中,虽然是大部分是可以零开销桥接,零开销并不意味...

智捷课堂
2016/01/18
32
0
Swift入门篇-基本类型

Swift入门篇-基本类型 一:元组 格式 变量或常量关键字 元组变量 = ( 变量,变量, …) 说明: 1: 元组变量还是一个变量,只不过表现方式和其他变量不一样 2:()括号里面可以放入N个变量组...

法斗斗
2016/03/02
21
0

没有更多内容

加载失败,请刷新页面

加载更多

Centos7 python2.7和yum完全卸载及重装

                                     完全重装python和yum 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 1、删除现有...

roockee
17分钟前
3
0
【软件工程】绪论,深入浅出理解软件工程

软件和软件工程 什么是软件工程 软件工程是贯穿整个软件生命周期的工程学和方法论及其使用的工具(我说的) 软件工程要解决那些问题 软件的研发周期过长 软件开发成本居高不下 软件在交付之前...

丌官尚雄
23分钟前
3
0
无回路有向图的拓扑排序

因公司业务需要,在表单中每个字段都会配置自动计算,但自动计算公式中会引用到其他字段中的值。所以希望可以根据计算公式,优先计算引用的公式。所以最终使用了无回路有向图的扩扑排序来实现...

兜兜毛毛
今天
6
0
如何抢占云栖大会C位?史上最强强强攻略来了

点击观看视频: APSARA云栖大会开发者情怀 原文链接 本文为云栖社区原创内容,未经允许不得转载。

阿里云官方博客
今天
6
0
Kubernetes 从懵圈到熟练:集群服务的三个要点和一种实现

作者 | 声东 阿里云售后技术专家 文章来源:Docker,点击查看原文。 以我的经验来讲,理解 Kubernetes 集群服务的概念,是比较不容易的一件事情。尤其是当我们基于似是而非的理解,去排查服务...

阿里巴巴云原生
今天
11
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部