使用ARC能幫我們減輕不少內存管理方面的負擔,尤其是對用慣了Java的程序員來說。但是像我這種Java基礎本身就不牢固,做了兩年的iOS已經習慣手動管理內存的半吊子,使用ARC還是經常碰壁。
最近碰到了CFObject和NSObject轉換的問題,由於ARC不能管理Core Foundation Object的生命周期,所以在Core Foundation和ARC之間,我們需要使用到__bridge,__bridge_retained和__bridge_transfer三個轉換關鍵字。
根據蘋果官方的文檔(https://developer.apple.com/library/ios/#releasenotes/ObjectiveC/RN-TransitioningToARC/Introduction/Introduction.html):
__bridge只做類型轉換,但是不修改對象(內存)管理權;
__bridge_retained(也可以使用CFBridgingRetain)將Objective-C的對象轉換為Core Foundation的對象,同時將對象(內存)的管理權交給我們,後續需要使用CFRelease或者相關方法來釋放對象;
__bridge_transfer(也可以使用CFBridgingRelease)將Core Foundation的對象轉換為Objective-C的對象,同時將對象(內存)的管理權交給ARC。