您的位置:首页 > 其它

__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对象转化时只涉及类型不涉及对象所有权的转化。

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)转移内存管理权
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息