你好,歡迎來到IOS教程網

 Ios教程網 >> IOS編程開發 >> IOS編程技術 >> iOS中的自由橋接

iOS中的自由橋接

編輯:IOS編程技術

摘抄自《iOS 6編程實戰》】

  與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。

     //NSString *str = @"123"; // Foundation
//CFStringRef str2 = (__bridge CFStringRef)str; // Core Foundation
//NSString *str3 = (__bridge NSString *)str2;

//    CFArrayRef ---- NSArray
//    CFDictionaryRef ---- NSDictionary
//    CFNumberRef ---- NSNumber

// Core Foundation中手動創建的數據類型,都需要手動釋放
//    CFArrayRef array = CFArrayCreate(NULL, NULL, 10, NULL);
//    CFRelease(array);
//
//
//    CGPathRef path = CGPathCreateMutable();
//    CGPathRetain(path);
//
//    CGPathRelease(path);
//    CGPathRelease(path);
/**
 凡是函數名中帶有create\copy\new\retain等字眼, 都應該在不需要使用這個數據的時候進行release
 GCD的數據類型在ARC環境下不需要再做release
 CF(Core Foundation)的數據類型在ARC\MRC環境下都需要再做release
 */  
  1. 上一頁:
  2. 下一頁:
蘋果刷機越獄教程| IOS教程問題解答| IOS技巧綜合| IOS7技巧| IOS8教程
Copyright © Ios教程網 All Rights Reserved