2013-01-16 48 views
2

正如我們所知,在免費橋接類型和目標c類型(如CFArrayRefNSArray)之間進行轉換非常容易。昨天,我發現了一段代碼,轉換CGImageRef(這是不是一個免費的工具,橋型),以id如下:目標和非免費橋接類型之間的轉換

CALayer *imgLayer = [CALayer layer]; 
imgLayer.contents = (id)aImage.CGImage; 

但是,它工作正常。但我不明白,因爲CGImageRef根據蘋果的文件不屬於免費橋接類型。看第二行代碼,imgLayer應保留分配給屬性內容的值。因爲CGImageRef轉換爲id,所以我認爲在屬性內容的setter方法中,它會發送一個保留消息給這個對象,像這樣[xxx retain]。但aImage.CGImage不是一個對象,所以我不認爲這個保留消息將正確執行(但它會)。所以我的問題是這種轉換背後的實際行動是什麼?

回答

2

這些方法是Apple爲方便起見添加的規則的一個例外。由於編譯器知道Objective-C命名約定和隱含的內存管理,因此Objective-C函數返回的Core Foundation對象將被自動轉換並正確處理。

請參閱部分的編譯器處理CF對象返回可可方法this document

免費橋接有點過時的術語。它提到了Core Foundation C對象和Objective-C對象之間的無縫連接。然而,對於ARC來說,轉換不再是無縫的,因爲編譯器需要提示在橋接它們之後如何處理相應的對象。但是,在這種情況下,它從該方法的命名約定中獲得了提示。

此外,所有Core Foundation對象基本上都可以轉換爲Objective-C對象。如果沒有相應的類型,那麼他們只會成爲專門爲此目的而設計的特種班級(NSCFType)。

+0

謝謝!儘管我是Objective-C的初學者,但你的回答對我來說很清楚。 – Kery