(九十九)桥接的介绍
2015-07-31 23:28
197 查看
OC中的桥接用于在C结构体(例如CFStringRef)和OC对象(例如NSString)之间进行转换。
在非ARC环境下,如果要实现转换,直接进行强制类型转换:
在ARC环境下,不能这样转换,要借助桥接:
桥接有三种方式:其中type是类型名,而expression一半不用填写。
(__bridge <#type#>)<#expression#>) 仅仅将值的地址进行转换,并没有转移对象的所有权,如果被桥接的对象释放,则桥接后的值也无法使用。在ARC下使用__bridge,因为所有权仍然属于OC,因此归ARC管制,不必手动释放。
(__bridge_retained <#CF type#>)<#expression#>) 将对象的所有权转移给桥接后的对象。
在ARC下使用__bridge_retained,此时ARC不能管理C语言内存,因此应该手动释放,应该使用CFRelease释放。等同于CFBridgingRetain(<#id X#>)
(__bridge_transfer <#Objective-C type#>)<#expression#>) 会转移所有权,并且会自动释放内存。等同于CFBridgingRelease(<#CFTypeRef X#>)
因此一般使用__bridge或者__bridge_transfer。
在非ARC环境下,如果要实现转换,直接进行强制类型转换:
// NSString转C String NSString *ocStr = [NSString stringWithFormat:@"OC字符串"]; CFStringRef cfStr = (CFStringRef)ocStr; // 直接创建C String CFStringRef cfStr1 = CFStringCreateWithCString(CFAllocatorGetDefault(), "C String", kCFStringEncodingASCII); // C String转NSString NSString *ocStr1 = (NSString *)cfStr1;
在ARC环境下,不能这样转换,要借助桥接:
NSString *ocStr = [NSString stringWithFormat:@"OC字符串"]; CFStringRef cfStr = (__bridge CFStringRef)ocStr; NSString *ocStr1 = (__bridge NSString *)cfStr1;
桥接有三种方式:其中type是类型名,而expression一半不用填写。
(__bridge <#type#>)<#expression#>) 仅仅将值的地址进行转换,并没有转移对象的所有权,如果被桥接的对象释放,则桥接后的值也无法使用。在ARC下使用__bridge,因为所有权仍然属于OC,因此归ARC管制,不必手动释放。
(__bridge_retained <#CF type#>)<#expression#>) 将对象的所有权转移给桥接后的对象。
在ARC下使用__bridge_retained,此时ARC不能管理C语言内存,因此应该手动释放,应该使用CFRelease释放。等同于CFBridgingRetain(<#id X#>)
(__bridge_transfer <#Objective-C type#>)<#expression#>) 会转移所有权,并且会自动释放内存。等同于CFBridgingRelease(<#CFTypeRef X#>)
因此一般使用__bridge或者__bridge_transfer。
相关文章推荐
- Java--接口
- (九十九)桥接的介绍
- Eclipse OSGi调试过程
- 博客之思
- shell脚本:查找文本 与 简单的grep
- 【leetcode c++】 112 Path Sum
- Ubuntu 12.04 配置记录
- HDU 2896 病毒侵袭 (AC自动机)
- Linux中profile、bashrc、bash_profile之间的区别和联系
- 14个Xcode中常用的快捷键操作
- JavaScript (常用的选择器和查询元素以及各种实例)
- Web项目导入的时候,各种配置文件报错解决办法
- Android学习笔记之Intent
- STM8L101F3P6低功耗
- JavaScript--DOM增删改操作
- ITOO3.1开发问题汇总(一)
- apue 第14章 高级I/O
- add.fun.php
- hibernate之缓存
- 标签(TabHost)