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