OC 和 Core Foundation 對象相互轉(zhuǎn)換的內(nèi)存管理

iOS允許Objective-C 和 Core Foundation 對象之間可以輕松的轉(zhuǎn)換,拿 NSString 和 CFStringRef 來說,直接轉(zhuǎn)換豪無壓力:

CFStringRef aCFString = (CFStringRef)aNSString;

NSString *aNSString = (NSString *)aCFString;

ARC的誕生大大簡化了我們針對內(nèi)存管理的開發(fā)工作,但是只支持管理 Objective-C 對象, 不支持 Core Foundation 對象。Core Foundation 對象必須使用CFRetain和CFRelease來進(jìn)行內(nèi)存管理。那么當(dāng)使用Objective-C 和 Core Foundation 對象相互轉(zhuǎn)換的時候,必須讓編譯器知道,到底由誰來負(fù)責(zé)釋放對象,是否交給ARC處理。只有正確的處理,才能避免內(nèi)存泄漏和double free導(dǎo)致程序崩潰。

根據(jù)不同需求,有3種轉(zhuǎn)換方式

__bridge ? ? ? ? ? ? ? ? (不改變對象所有權(quán))

__bridge_retained 或者 CFBridgingRetain() ? ? ? ? ? ? ? (解除 ARC 所有權(quán))

__bridge_transfer 或者 CFBridgingRelease() ? ? ? ? ? ? (給予 ARC 所有權(quán))


1. __bridge_retained 或者 CFBridgingRetain()

__bridge_retained 或者 CFBridgingRetain() ?將Objective-C對象轉(zhuǎn)換為Core Foundation對象,把對象所有權(quán)橋接給Core Foundation對象,同時剝奪ARC的管理權(quán),后續(xù)需要開發(fā)者使用CFRelease或者相關(guān)方法手動來釋放對象。

來看個例子:

- (void)viewDidLoad{

[super viewDidLoad];

NSString *aNSString = [[NSString alloc]initWithFormat:@"test"];

CFStringRef aCFString = (__bridge_retained CFStringRef) aNSString;

(void)aCFString;

//正確的做法應(yīng)該執(zhí)行CFRelease,沒有release會內(nèi)存泄露。

//CFRelease(aCFString);

}

CFBridgingRetain() ?是 __bridge_retained 的宏方法,下面兩行代碼等價:

CFStringRef aCFString = (__bridge_retained CFStringRef) aNSString;

CFStringRef aCFString = (CFStringRef) CFBridgingRetain(aNSString);

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容