Foundation對象和Core Foundation對象有什么區(qū)別

Foundation對象是OC對象,使用OC語言實(shí)現(xiàn);Core Foundation對象是C對象,使用C語言實(shí)現(xiàn)。兩者之間通過__bridge、__bridge_transfer、__bridge__retained等關(guān)鍵字轉(zhuǎn)換(橋接)。

Foundation對象和Core Foundation對象更重要的區(qū)別是ARC下內(nèi)存管理問題,在非ARC下兩者都需要開發(fā)者手動管理內(nèi)存,沒有區(qū)別。但在ARC下,系統(tǒng)只會自動管理Foundation對象的釋放,而不支持對Core Foundation對象的管理。因此,在ARC下兩者進(jìn)行轉(zhuǎn)換后,必須要確定轉(zhuǎn)換后的對象是由開發(fā)者手動管理,還是由ARC系統(tǒng)繼續(xù)管理,否則可能導(dǎo)致內(nèi)存泄漏問題。

下面以NSString和CFStringRef對象為例,介紹兩者轉(zhuǎn)換和內(nèi)存管理權(quán)移交的問題。
1. 在非ARC下,NSString和CFStringRef對象可以直接進(jìn)行強(qiáng)制轉(zhuǎn)換,都是手動管理內(nèi)存,無需關(guān)心內(nèi)存管理權(quán)的移交問題。
2. 在ARC下,NSString和CFStringRef對象在相互轉(zhuǎn)換時(shí),需要選擇使用__bridge、__bridge_transfer和__bridge_retained來確定對象的管理權(quán)移交問題。
2.1 __bridge最常用,它的含義是不改變對象的所有權(quán)管理者,本來由ARC管理的Foundation對象,轉(zhuǎn)換成Core Foundation對象后依然由ARC管理;本來由開發(fā)者手動管理的Core Foundation對象轉(zhuǎn)換成Foundation對象后繼續(xù)由開發(fā)者手動管理。

    // ARC管理的Foundation對象
    NSString *s1 = @"string";
    // 轉(zhuǎn)換后依然由ARC管理
    CFStringRef cfstring = (__bridge CFStringRef)s1;
    // 開發(fā)者手動管理的Core Foundation對象
    CFStringRef s2 = CFStringCreateWithCString(NULL, "string", kCFStringEncodingASCII);
    // 轉(zhuǎn)換后繼續(xù)由開發(fā)者手動管理
    NSString *fstring = (__bridge NSString *)s2;

2.2 __bridge_transfer用在將Core Foundation對象轉(zhuǎn)換成Foundation對象時(shí),用于進(jìn)行內(nèi)存管理權(quán)的移交,即本來由開發(fā)者手動管理的Core Foundation對象轉(zhuǎn)換成Foundation對象后,交由ARC來管理對象的釋放,開發(fā)者不用再關(guān)心對象的釋放問題,因?yàn)椴粫l(fā)生內(nèi)存泄漏。

   // 開發(fā)者手動管理的Core Foundation對象
    CFStringRef s2 = CFStringCreateWithCString(NULL, "string", kCFStringEncodingASCII);
    // 轉(zhuǎn)換后由ARC來管理對象的釋放,不用擔(dān)心內(nèi)存泄漏
    NSString *fstring = (__bridge_transfer NSString *)s2;
    // 另一種等效寫法
    //NSString *fstring = (NSString *)CFBridgingRelease(s2);

2.3 __bridge_retained用在將Foundation對象轉(zhuǎn)換成Core Foundation對象時(shí),進(jìn)行ARC內(nèi)存管理權(quán)的剝奪,即本來由ARC管理的Foundation對象在轉(zhuǎn)換成Core Foundation對象后,ARC不再繼續(xù)管理對象,需要開發(fā)者自己手動釋放該對象,否則會發(fā)生內(nèi)存泄漏。

    // ARC管理的Foundation對象
    NSString *s1 = @"string";
    // 轉(zhuǎn)換后ARC不再管理,需要手動釋放
    CFStringRef cfstring = (__bridge_retained CFStringRef)s1;
    // 另一種等效寫法
    CFStringRef cfstring = (CFStringRef)CFBridgingRetain(s1);
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

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

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