- Foundation框架是使用OC實現的
- Core Foundation是使用C實現的
- Foundation對象 和 Core Foundation對象間的轉換:俗稱
橋接
- ARC環境:使用橋接,共有三種橋接關鍵字
- __bridge:可用于Foundation對象 和 Core Foundation對象間的
相互轉換
- __bridge_retained:用于
Foundation對象
轉成Core Foundation對象
- __bridge_transfer:用于
Core Foundation對象
轉成Foundation對象
- __bridge:可用于Foundation對象 和 Core Foundation對象間的
- Foundation對象 轉成 Core Foundation對象
- 使用
__bridge
橋接- 如果使用
__bridge
橋接,它僅僅
是將strOC的地址
給了strC, 并沒有
轉移內存管理權,也就是說, 如果使用__bridge橋接, 那么如果strOC釋放了,strC也不能再使用了 - 如果是使用__bridge橋接,那么strC可以
不用
主動釋放, 因為ARC環境會自動管理
NSString *strOC = [NSString stringWithFormat:@"abcdefg"]; // strC不用手動釋放 CFStringRef strC = (__bridge CFStringRef)strOC1; NSLog(@"%@ %@", strOC, strC);
- 如果使用
- 使用
__bridge_retained
橋接- 如果使用__bridge_retained橋接,它會將strOC的內存管理權
轉交給
strC, 也就是說,即便strOC被釋放了, strC也可以使用
- 如果是使用__bridge_retained橋接,那么strC必須自己
手動釋放
,因為橋接的時候已經將對象的內存管理權轉交
給了strC,而C語言的東西不歸ARC管理 -
__bridge_retained
關鍵字等價于CFBridgingRetain
函數
- 如果使用__bridge_retained橋接,它會將strOC的內存管理權
- 使用
NSString *strOC = [NSString stringWithFormat:@"abcdefg"];
// CFStringRef strC = (__bridge_retained CFStringRef)strOC;
CFStringRef strC = CFBridgingRetain(strOC);// 這一句, 就等同于上一句
CFRelease(strC);
-
Core Foundation對象 轉成 Foundation對象
- 使用__bridge橋接
- 如果使用
__bridge
橋接,它僅僅
是將strC的地址
給了strOC, 并沒有
轉移內存管理權,也就是說, 如果使用__bridge橋接, 那么如果strC釋放了,strOC也不能再使用了 - strC還需要
手動釋放
- 如果使用
CFStringRef strC = CFStringCreateWithCString(CFAllocatorGetDefault(), "12345678", kCFStringEncodingASCII); NSString *strOC = (__bridge NSString *)strC; CFRelease(strC);
- 使用__bridge_transfer橋接
- 如果使用__bridge_transfer橋接,它會將strC的內存管理權
轉交給
strOC, 也就是說,即便strC被釋放了, strOC也可以使用
- 如果使用__bridge_transfer橋接, 那么就
不用
手動釋放strC` -
__bridge_transfer
關鍵字等價于CFBridgingRelease
函數
- 如果使用__bridge_transfer橋接,它會將strC的內存管理權
CFStringRef strC = CFStringCreateWithCString(CFAllocatorGetDefault(), "12345678", kCFStringEncodingASCII); // NSString *strOC = (__bridge_transfer NSString *)strC; NSString *strOC = CFBridgingRelease(strC); // 這一句, 就等同于上一句
- 使用__bridge橋接
MRC環境: Foundation對象 和 Core Foundation對象間可以
直接強轉
-(void)bridgeInMRC
{
// 將Foundation對象轉換為Core Foundation對象,直接強制類型轉換即可
NSString *strOC1 = [NSString stringWithFormat:@"xxxxxx"];
CFStringRef strC1 = (CFStringRef)strOC1;
NSLog(@"%@ %@", strOC1, strC1);
[strOC1 release];
CFRelease(strC1);
// 將Core Foundation對象轉換為Foundation對象,直接強制類型轉換即可
CFStringRef strC2 = CFStringCreateWithCString(CFAllocatorGetDefault(), "12345678", kCFStringEncodingASCII);
NSString *strOC2 = (NSString *)strC2;
NSLog(@"%@ %@", strOC2, strC2);
[strOC2 release];
CFRelease(strC2);
}