Foundation对象与Core Foundation对象如何转换
来源:互联网 发布:网络马甲是什么意思 编辑:程序博客网 时间:2024/06/07 06:32
1.Foundation对象与Core Foundation对象有什么区别
Foundation框架是使用OC实现的,Core Foundation是使用C实现的,Foundation对象 和 Core Foundation对象间的转换:俗称桥接。
2. ARC环境如何桥接
- __bridge_retained:用于Foundation对象 转成 Core Foundation对象,解除 ARC 所有权
- __bridge_transfer: 用于Core Foundation对象 转成 Foundation对象,给予 ARC 所有权
- __bridge:可用于Foundation对象 和 Core Foundation对象间的转换,不改变对象所有权
>>我们首先看: Foundation对象如何转成 Core Foundation对象?
- _bridge桥接
NSString *strOC1 = [NSString stringWithFormat:@"abcdefg"]; CFStringRef strC1 = (__bridge CFStringRef)strOC1; NSLog(@"%@ %@", strOC1, strC1);代码中使用了_bridge桥接, 如果使用__bridge桥接,它仅仅是将strOC的地址给了strC, 并没有转移对象的所有权,也就是说, 如果使用__bridge桥接, 那么如果strOC释放了,strC也不能用了,因为在ARC条件下,如果是使用__bridge桥接,那么strC可以不用主动释放, 因为ARC会自动管理strOC和strC。
- __bridge_retained桥接
NSString *strOC2 = [NSString stringWithFormat:@"abcdefg"]; //CFStringRef strC2 = (__bridge_retained CFStringRef)strOC2; CFStringRef strC2 = CFBridgingRetain(strOC2);// 这一句, 就等同于上一句 CFRelease(strC2);如果使用__bridge_retained桥接,它会将对象的所有权转移给strC, 也就是说, 即便strOC被释放了, strC也可以使用.注意:在ARC条件下,如果是使用__bridge_retained桥接,那么strC必须自己手动释放,因为桥接的时候已经将对象的所有权转移给了strC,而C语言的东西不是不归ARC管理的
>>紧接着来看看: Core Foundation对象如何 转成 Foundation对象?
- _bridge桥接(和上面类似)
CFStringRef strC3 = CFStringCreateWithCString(CFAllocatorGetDefault(), "12345678", kCFStringEncodingASCII);NSString *strOC3 = (__bridge NSString *)strC3;CFRelease(strC3);如果使用__bridge桥接,它仅仅是将strC的地址给了strOC, 并没有转移对象的所有权, 也就是说如果使用__bridge桥接,那么如果strC释放了,strOC也不能用了。
- __bridge_transfer桥接
CFStringRef strC4 = CFStringCreateWithCString(CFAllocatorGetDefault(), "12345678", kCFStringEncodingASCII); //NSString *strOC = (__bridge_transfer NSString *)strC; NSString *strOC4 = CFBridgingRelease(strC4); // 这一句, 就等同于上一句如果使用__bridge_transfer桥接,它会将对象的所有权转移给strOC, 也就是说, 即便strC被释放了, strOC也可以使用 。如果使用了__bridge_transfer桥接, 他会自动释放strC, 也就是以后我们不用手动释放strC。
3.MRC环境如何桥接(直接强转)
-(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); }
未完待续。。。。。。。。。。。。。。。。。。。。。。
0 0
- Foundation对象与Core Foundation对象如何转换
- OC对象与Core Foundation对象的转换
- Core Foundation(C对象)与 Foundation(OC对象)之间的转换 理解
- Core Foundation(C对象)与 Foundation(OC对象)之间的转换 理解
- Foundation对象与Core Foundation对象间的转换:Toll-Free Birdge
- Core Foundation(C对象)与 Foundation(OC对象)之间的转换 理解
- Objective-C对象与Core Foundation对象
- Objective-C对象与Core Foundation对象
- Core Foundation 与 foundation
- Core Foundation与Foundation
- core foundation framework对象和foundation framework对象的相互转换 ---Toll-Free Bridging
- Objective-C 和 Core Foundation 对象相互转换
- Objective-C 和 Core Foundation 对象相互转换内存管理
- Objective-C对象和Core Foundation 对象
- Objective-C对象和Core Foundation 对象
- CoreFoundation于Foundation对象转换
- Core Foundation对象的内存管理原则
- Core Foundation 对象的内存管理
- 匈牙利算法改进 之 队列优化寻找极大增广路径集 —— Hopcroft-Karp算法 【记录】
- nginx 配置文件
- MFC模态对话框和非模态对话框
- VS2008 SP1开发环境补丁列表
- 直接在安卓运行C
- Foundation对象与Core Foundation对象如何转换
- 【CSS】兼容IE7的各个各样的标题面板
- 基于大规模语料的新词发现算法
- 如何准确的计算并提高APP用户留存?
- SQL PRIMARY KEY 约束 高级编程
- 浅析Linux 中Java环境变量设置
- 更改cmd的默认路径
- Angularjs $scope 里面的$apply方法 和 $watch方法
- 心得