- 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);
}