Swift中 core Foundation的运用

Core Foundation

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爽多了???
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 201,784评论 5 474
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,745评论 2 378
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 148,702评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,229评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,245评论 5 363
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,376评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,798评论 3 393
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,471评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,655评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,485评论 2 318
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,535评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,235评论 3 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,793评论 3 304
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,863评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,096评论 1 258
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,654评论 2 348
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,233评论 2 341

推荐阅读更多精彩内容

  • 昨天晚上的古筝课,学得很认真,感觉这堂课很容易学。一堂课下来,将曲子《拴豆豆》全弹完了,很有成就感。第一次全部...
    几点周阅读 104评论 0 0
  • 最近工作比较忙,有点累,但内心是舒服的,回想上班这两年来,从新人变老人,经历过许许多多的事,刚上班那会做什么都...
    悦小小阅读 208评论 0 1
  • 一、读懂diff diff是Unix/Linux系统的一个很重要的工具程序。它用来比较两个文本文件的差异,是代码版...
    overflow_hidden阅读 1,845评论 2 2
  • 微思考 什么是真实世界的强与弱?他们真如表面上看上去那样浅显吗?为什么马尔科姆·格拉德威尔(Malcolm T.G...
    微思考阅读 1,842评论 4 13