Swift中的 Core Foundation 類型是一個成熟的類。當出現內存管理註釋時,Swift 會自動地管理 Core Foundation 對象的內存,這其中包括你實例化了的 Core Foundation 對象。在 Swift 中,你能夠自由變換 Fundation 和 Core Foundation 類型。若是你想先轉換爲橋接 Foundation 類型時,你也能夠橋接一些 toll-free bridged Core Foundation 類型到 Swift 標準庫類型。
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 函數:
spa
CFStringRef StringByAddingTwoStrings(CFStringRef string1, CFStringRef string2)
這裏說明了Swift是怎麼導入的:
code
func StringByAddingTwoStrings(CFString!, CFString!) -> Unmanaged<CFString>!
假設您從 unannotated APIs 接收了非託管的對象,在使用它以前,你必須將它轉換爲可以內存管理的對象。在這方面,Swift 能夠幫你進行內存管理而不用本身動手。同時,Unmanaged<T>結構也提供了兩個方法來把一個非託管對象轉換爲一個可內存管理的對象--takeUnretainedValue()方法和takeRetainedValue()方法。這兩個方法會返回原始的,非封閉的對象類型。您能夠根據您實際調用的APIs返回的unretained或retained的對象,來選擇哪一方法更合適。
好比,假設這裏有一個 C 函數,這個函數在返回值前不會釋放CFString對象。在使用這個對象前,您使用takeUnretainedValue()函數,以將它轉換爲一個可以內存管理託管的對象。
orm
let memoryManagedResult = StringByAddingTwoStrings(str1, str2).takeUnretainedValue()// memoryManagedResult is a memory managed CFString
您也能夠在一個非託管的對象中使用retain(),release()和autorelease()方法,可是這種作法並不值得推薦。
對象