Swift中 core Foundation的運用

Swift中的 Core Foundation 類型是一個成熟的類。當出現內存管理註釋時,Swift 會自動地管理 Core Foundation 對象的內存,這其中包括你實例化了的 Core Foundation 對象。在 Swift 中,你能夠自由變換 Fundation 和 Core Foundation 類型。若是你想先轉換爲橋接 Foundation 類型時,你也能夠橋接一些 toll-free bridged Core Foundation 類型到 Swift 標準庫類型。ios

1.重定義類型

當 Swift 導入 Core Foundation 類型時,編譯器會重映射導入的類型名字。編譯器會從每一個類型名字的末端移除Ref,這是由於全部的 Swift 類都屬於引用類型,所以後綴是多餘的。ide

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 對象。post

3.非託管對象

當 Swift 導入 unannotated 的APIs時,編譯器將不會自動地對返回的 Core Foundation 對象進行內存管理託管。Swift 將這些返回的 Core Foundation 對象封閉在一個Unmanaged<T>結構中。那些間接返回 Core Foundation 的對象也是非託管的。舉個例子,這裏有一個 unannotated 的 C 函數:學習

這裏說明了Swift是怎麼導入的:url

unmanaged 爲未被管理的類型

假設您從 unannotated APIs 接收了非託管的對象,在使用它以前,你必須將它轉換爲可以內存管理的對象。在這方面,Swift 能夠幫你進行內存管理而不用本身動手。同時,Unmanaged<T>結構也提供了兩個方法來把一個非託管對象轉換爲一個可內存管理的對象--takeUnretainedValue()方法和takeRetainedValue()方法。這兩個方法會返回原始的,非封閉的對象類型。您能夠根據您實際調用的APIs返回的unretained或retained的對象,來選擇哪一方法更合適。代理

好比,假設這裏有一個 C 函數,這個函數在返回值前不會釋放CFString對象。在使用這個對象前,您使用takeUnretainedValue()函數,以將它轉換爲一個可以內存管理託管的對象。code

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爽多了???
相關文章
相關標籤/搜索