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