__bridge的相关使用
2016-07-27 20:34
465 查看
ARC(Automatic Reference Count:自动引用计数)是苹果在WWDC2011年大会提出的用于内存管理的一项技术,解决了iOS中90%的内存管理问题,让程序员从MRC(Manual Reference Count:手工引用计数)解放了出来。这篇文章不涉及ARC的原理,因为这方面优秀的博客有很多,我就主要总结一下使用ARC可能忽略的一些问题。
bridge,顾名思义就是桥,在iOS中就是建立底层框架如CoreFoundation(以下简称CF)、Core Graphics、Core Text等的对象和OC对象之间的联系,其实我们主要关心的就是它们的内存管理方式的差异。OC对象可以交给ARC,CF本质上是C风格指针变量,因此就不能自然而然的使用ARC。解决这个问题的第一种方式就是当用完它之后我们调用CFRelease释放其所占用的内存,另外一种方式就是通过bridge将它们的内存管理方式相互转换。
__bridge:CF对象和OC对象转化时只涉及类型不涉及对象所有权的转化。
因为这里只是将OC对象的类型转化成CF对象类型,对象的所有权没有改变,依然属于ARC的管辖范围,所以不用加CFRelease语句。但是将用__bridge将CF类型转化成OC对象,在原来的CF对象不用试就需要调用CFRelease释放其内存。
__bridge_transfer:CF对象与OC对象进行类型转换后,CF对象的所有权一并交给OC对象,此时ARC就能管理已经转化成OC对象的CF对象,就不在需要调用CFRelease。
此时的ocString就持用了CFString的所有权,就不再需要调用CFRelease方法来释放cfString所占用的内存了。
__bridge_retained:OC对象与CF对象进行类型转换后,OC对象的所有权一并交给CF对象,ARC此时就不能管理已经被转化成CF对象的OC对象的内存了,这就需要调用CFRelease方法来手动释放内存了。
参考:http://blog.sina.com.cn/s/blog_65a8ab5d0101c8k2.html
土土哥的技术博客:为GCD队列绑定NSObject类型上下文数据-利用__bridge_retained(transfer)转移内存管理权
bridge,顾名思义就是桥,在iOS中就是建立底层框架如CoreFoundation(以下简称CF)、Core Graphics、Core Text等的对象和OC对象之间的联系,其实我们主要关心的就是它们的内存管理方式的差异。OC对象可以交给ARC,CF本质上是C风格指针变量,因此就不能自然而然的使用ARC。解决这个问题的第一种方式就是当用完它之后我们调用CFRelease释放其所占用的内存,另外一种方式就是通过bridge将它们的内存管理方式相互转换。
__bridge:CF对象和OC对象转化时只涉及类型不涉及对象所有权的转化。
NSURL *url = [NSURL alloc] initWithString:@"http://www.baidu.com"]]; CFURLRef ref = (__bridge CFURLRef)url;
因为这里只是将OC对象的类型转化成CF对象类型,对象的所有权没有改变,依然属于ARC的管辖范围,所以不用加CFRelease语句。但是将用__bridge将CF类型转化成OC对象,在原来的CF对象不用试就需要调用CFRelease释放其内存。
__bridge_transfer:CF对象与OC对象进行类型转换后,CF对象的所有权一并交给OC对象,此时ARC就能管理已经转化成OC对象的CF对象,就不在需要调用CFRelease。
CFStringRef cfString= CFURLCreateStringByAddingPercentEscapes( NULL, (__bridge CFStringRef)text, NULL, CFSTR("!*’();:@&=+$,/?%#[]"), CFStringConvertNSStringEncodingToEncoding(NSUTF8StringEncoding)); NSString *ocString = (__bridge_transfer CFStringRef)cfString;
此时的ocString就持用了CFString的所有权,就不再需要调用CFRelease方法来释放cfString所占用的内存了。
__bridge_retained:OC对象与CF对象进行类型转换后,OC对象的所有权一并交给CF对象,ARC此时就不能管理已经被转化成CF对象的OC对象的内存了,这就需要调用CFRelease方法来手动释放内存了。
总结
如果你想测试一下,可以使用Xcode自带的Instruments中的leaks检查是否存在内存泄漏。(打开xcode>Product>Profile>Leaks)参考:http://blog.sina.com.cn/s/blog_65a8ab5d0101c8k2.html
扩展(2016-08-24)
这种在 Core Foundation 和 Foundation 之间交换使用数据类型的技术就叫 Toll-Free Bridging,详情请参见:http://gracelancy.com/blog/2014/04/21/toll-free-bridging/土土哥的技术博客:为GCD队列绑定NSObject类型上下文数据-利用__bridge_retained(transfer)转移内存管理权
相关文章推荐
- php设计模式 Bridge (桥接模式)
- PHP-Java-Bridge使用笔记
- docker的网络
- 桥接模式构建 docker 网络
- KVM网络配置 Bridge方式
- Android Debug Bridge (adb)
- vmware中的bridge、nat区别
- ARC 下__bridge、__bridge_retained、__bridge_transfer三者使用和区别
- AP常用的五种模式
- openstack 网络发展简史
- openstack 网络发展简史
- openstack 网络发展简史
- 向Bridge模式招手
- 网络数据包中继与bridge 区别
- vmware下ubuntu的网络桥接配置
- 宿主机跟Vmware中的linux使用host-only,bridge 方式通信
- freeswitch新增app接口
- vmware centos bridge 静态ip配置
- ARC中内存管理相关的关键字
- Linux下的虚拟Bridge实现