使用 __bridge 关键字来实现id类型与void*类型的相互转换。看下面的例子。

id obj = [[NSObject alloc] init];
 
void *p = (__bridge void *)obj;
 
id o = (__bridge id)p;

__bridge_retained
先来看使用 __bridge_retained 关键字的例子程序:

id obj = [[NSObject alloc] init];
 
void *p = (__bridge_retained void *)obj;
从名字上我们应该能理解其意义:类型被转换时,其对象的所有权也将被变换后变量所持有。如果不是ARC代码,类似下面的实现:

id obj = [[NSObject alloc] init];
 
void *p = obj;
[(id)p retain];

__bridge_transfer
相反,当想把本来拥有对象所有权的变量,在类型转换后,让其释放原先所有权的时候,需要使用 __bridge_transfer 关键字。文字有点绕口,我们还是来看一段代码吧。

如果ARC无效的时候,我们可能需要写下面的代码。

// p 变量原先持有对象的所有权
id obj = (id)p;
[obj retain];
[(id)p release];
那么ARC有效后,我们可以用下面的代码来替换:

// p 变量原先持有对象的所有权
id obj = (__bridge_transfer id)p;
可以看出来,__bridge_retained 是编译器替我们做了 retain 操作,而 __bridge_transfer 是替我们做了 release1。

最新文章

  1. JS查看Object对象的内容
  2. machine learning----->学习成绩
  3. 更新安装xcode7插件
  4. 安装mysql之后,存入中文出现乱码 02
  5. xtrabackup原理2
  6. C++ (P160—)多继承 二义性 虚基类 “向上转型”
  7. perl 回调必须是函数引用
  8. java 基础知识六 字符串1
  9. ehcache.xml 属性大全
  10. Linux内存管理 (13)回收页面
  11. vba判断文件是否存在的两种方法(转)
  12. radio点击一下选中,再点击恢复未选状态
  13. Redis介绍和安装
  14. 内购审核被拒-[environment-sandbox]
  15. ffmpeg命令的使用
  16. Generate a Push Certificate
  17. servlet中请求转发获取数据等,,,
  18. pycharm自动生成头文件注释
  19. http 中的 Get 与 Post
  20. Docker应用系列(六)| 如何去掉sudo及避免权限问题

热门文章

  1. web04-LoginServlet
  2. Beta 冲刺1
  3. 【贪心算法】POJ-3040 局部最优到全局最优
  4. 【搜索】POJ-3009 DFS+回溯
  5. vSphere Client 连接ESXi 或者是vCenter 时虚拟机提示VMRC异常的解决办法
  6. PHP导出sql文件
  7. sublimeText3的一些操作记录
  8. SOA (面向服务的架构)-Service Oriented Architecture
  9. C# 源码计数器
  10. Java 基础--小结