與Objective-C庫不同,我們在Objective-C中使用標准C語言和Core Foundation類庫(CF*方法)不會遵循那些命名約定。這意味著ARC編譯器無法百分百地釋放不需要的內存。在ARC出現之前,我們可以將CF* 對象強制轉換成NS*對象,這稱為自由橋接(toll-free bridging)。也就是說,我們可以將CFString*通過類型轉換變成NSString*類型。而有了ARC,我們便無法再這麼做了,至少不指定 一個所有權轉移修飾符時確實如此。
ARC允許使用以下這些所有權轉移修飾符:__bridge、__bridge_retained、__bridge_transfer
1、__bridge
第一個修飾符__bridge是一個普通的轉換,它告訴ARC不要增加它的引用計數的值,也不要更改所有權。LLVM的設計師並沒有讓 __bridge成為默認所有權轉移修飾符,因為做這樣的決定過於大膽了。Core Foundation方法沒有一個合適的命名約定,所以在沒有明確指定一個所有權轉移修飾符的情況下,編譯器對於如何轉移一個C指針類型的所有權無法錯處 有把握的決定。
2、__bridge_retained
若想要轉換C指針類型並增加引用計數的值,我們可以使用第二個修飾符。當要從Objective-C方法(它創建一個Core Foundation對象並在之後使用CFRelease方法將其釋放)返回一個保留過的指針時,我們可以使用這個修飾符。如果Objective-C方 法屬於NSRETURNS_RETAINED系列,就要返回保留過的指針。
3、__bridge_transfer
如果要將Core Foundation指針類型轉換成Objective-C指針並為引用計數加1,可以使用最後一個修飾符。若Core Foundation方法創建一個對象,並且想要靠ARC來管理對象的內存,我們便可以使用這個修飾符。本質上,我們是“轉移”了所有權給ARC。