__bridge,__bridge_transfer和__bridge_retained

__bridge是oc对象和CF对象之间的相互转换,但是不涉及对象所有权的转换
__bridge_transfer是cf对象转为oc对象,将cf对象的所有权转给oc对象,此时ARC自动管理内存,作用同CFBridgingRelease()
__bridge_retained是OC对象转为CF对象,将OC对象的所有权转给CF对象,即OC对象转化成CF对象时,涉及到对象类型和对象所有权的转化,作用同CFBridgingRetain()

0x01 什么是对象间的桥接
Core Foundation 是一组C语言接口,它与Foundation功能相同,只是Foundation框架提供的是Objective-C接口。

Core Foundation中的对象也有类似引用计数的概念,其对应的接口是CFRetain/CFRelease;

这两个框架的对象之间可以相互转换,当使用ARC时,Core Foundation中的对象不被ARC所管理

所以Core Foundation和Foundation中的对象在相互转换的过程中会涉及到对象所有权的转换,这里便用到了bridge修饰符

__bridge关键字修饰的类型转换只把OC对象的指针传递给CF对象,但不传递它的所有权:

NSString *theString = @"Learn Objective-C";
cfString = (__bridge CFStringRef)theString;
 
// cfString gets the assignment, but ownership stays with theString.

当cfString被ARC release后,theString指针仍然指向一个有效的对象。
__bridge_retained
将OC对象转化为CF对象时,所有权归CF对象,相当于 CFBridgingRetain():

NSString *theString = @"Learn Objective-C";
cfString = (__bridge_retained CFStringRef)theString
 
//In this case, cfString string owns the pointer and its retain count is incremented.
//You’re responsible for managing it with retain/release.

使用__bridge_retained进行转换后,cfString便拥有了theString对象的所有权。

这时如果theString被ARC release,cfString仍然有效。

然而又因为Core Foundation中的对象也存在引用计数概念,所以需要使用CFRelease()手动对cfString进行release操作。

__bridge_transfer
这是与__bridge_retained相反的关键字声明。

__bridge_transfer将CF对象转化为OC对象时,所有权归OC对象,相当于CFbridgingRelease():

NSString *theString = @"Learn Objective-C";
cfString = (__bridge_transfer CFStringRef)theString;
 
//In this case, ARC owns the object and will ensure it’s released like any other ARC object.

使用__bridge_transfer进行转换后,ARC会确保theString被释放的同时,cfString也被释放。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 今天感恩节哎,感谢一直在我身边的亲朋好友。感恩相遇!感恩不离不弃。 中午开了第一次的党会,身份的转变要...
    迷月闪星情阅读 13,583评论 0 11
  • 彩排完,天已黑
    刘凯书法阅读 9,745评论 1 3
  • 表情是什么,我认为表情就是表现出来的情绪。表情可以传达很多信息。高兴了当然就笑了,难过就哭了。两者是相互影响密不可...
    Persistenc_6aea阅读 126,701评论 2 7