前奏

在平常开发中,我们可能遇到 CoreFoundation(CF) 框架的对象和 OC 对象之间的类型转换,这时候我们需要 __bridge 来帮忙
注意 : 如果是使用 CF

__bridge

  • CF -> OC (只完成类型转换)
- (void)bridgeCF2OC{CFStringRef aCFString = CFStringCreateWithCString(NULL, "bridge", kCFStringEncodingASCII);self.myString = (__bridge NSString *)(aCFString);(void)aCFString;NSLog(@"bridge--%@",self.myString);/*__bridge 关键字只负责 CF 到 OC 之间的对象类型转换,并没有把内存管理的权限交给 ARC,因此不管 ARC 还是 MRC 我们都需要管理 CF 对象的内存*/CFRelease(aCFString);
}
  • OC -> CF (只完成类型转换)
    NSString *aString = [NSString stringWithFormat:@"test"];CFStringRef cString = (__bridge CFStringRef)(aString);/*现在 String 的生命在 OC 手上,CF无法干预内存管理*/// CFRelease(cString);NSLog(@"%@",cString);

__bridge_transfer 或者 CFBridgingRelease()

  • CF -> OC (完成类型转换的同时,赋予了ARC管理内存的权限,CF还是有权限的)
  • NSString *aNSString = [[NSString alloc]initWithFormat:@"test"];CFStringRef aCFString = (__bridge_retained CFStringRef) aNSString;// 赋予ARC 管理内存的权利aNSString = (__bridge_transfer NSString *)aCFString;aNSString = nil;// 这里已经把权限交给了 ARC 了,如果ARC已经释放了内存,那么CF对象还是无法读取内存// NSLog(@"%@",aCFString);// CFRelease(aCFString);// NSLog(@"%@",aNSString);

__bridge_retained 或者 CFBridgingRetain()

  • OC -> CF (完成类型转换的同时,剥夺了ARC管理内存的权限,CF还是有权限的)
NSString *aString = [NSString stringWithFormat:@"test"];// 这时候对象的生命 周期管理责任交给 CF 了CFStringRef cString = (__bridge_retained CFStringRef)(aString);// 原对象的内存并不会因此而销毁aString = nil;NSLog(@"%@",cString);// 正确的释放方法 :CFRelease(cString);

转自:http://www.jianshu.com/p/1cc4bf898bf1

转载于:https://www.cnblogs.com/huangzs/p/7492818.html

__bridge 使用注意相关推荐

  1. IOS开发之__bridge,__bridge_transfer和__bridge_retained

    Core Foundation 框架 Core Foundation框架 (CoreFoundation.framework) 是一组C语言接口,它们为iOS应用程序提供基本数据管理和服务功能.下面列 ...

  2. __bridge,__bridge_retained,__bridge_transfer

    最近遇到类型转换需要添加__bridge等开始不是很理解,后面查询资料才知道在CFObject 与 NSObject 之间转换时,ARC是不能管理Core Foundation object的生命周期 ...

  3. IOS中__bridge,__bridge_retained和__bridge_transfer理解

    CFObject和NSObject转换的问题,由于ARC不能管理Core Foundation Object的生命周期,所以在Core Foundation和ARC之间,我们需要使用到__bridge ...

  4. IOS学习 ARC下__bridge

    总结于 IOS Tuturial 中 ARC两章,详细在dropbox pdf 文档. Toll-Free Bridging 当你在 Objective-C 和 Core Foundation 对象之 ...

  5. ARC中__bridge, __bridge__transfer, __bridge_retained 关系

    转在开头:转在这篇文章是因为我遇到一个问题,这篇文章解决了我这个问题,debug:cast of objective- c pointer type 'NSMutableDictionary *' t ...

  6. __bridge,__bridge_retained和__bridge_transfer的意思,区别与使用

    使用ARC能帮我们减轻不少内存管理方面的负担,尤其是对用惯了Java的程序员来说.但是像我这种Java基础本身就不牢固,做了两年的iOS已经习惯手动管理内存的半吊子,使用ARC还是经常碰壁. 最近碰到 ...

  7. iOS视频硬编码技术

    iOS视频硬编码技术 一.iOS视频采集硬编码 基本原理 硬编码 & 软编码 硬编码:通过系统自带的Camera录制视频,实际上调用的是底层的高清编码硬件模块,即显卡,不使用CPU,速度快 软 ...

  8. iostext添加点击事件_iOS给UILabel添加点击事件

    前言:笔者最近需要实现给UILabel中的链接添加点击事件的功能.使用so.com查了下,发现TTTAttributedLabel的封装程度比较好.整理了TTTAttributedLabel的基本使用 ...

  9. 如何轻松实现iOS9多任务管理器效果(iCarousel高级教程)

    前言 iOS9系统下 为了我司APP的兼容性问题 特意把手上的iOS Mac XCode都升级到了最新的beta版 然后发现iOS9的多任务管理器风格大变 变成了下面这种样子 我忽然想起来之前的文章提 ...

最新文章

  1. 推荐几个小而美的原创公众号!
  2. koa-中间件流程控制
  3. 交换机工作原理(下)
  4. 使用python开发网页游戏_如何用python开发游戏
  5. python2019慕课答案_中国大学慕课mooc2020Python编程基础章节测试答案
  6. Zoj 2947——Abbreviation
  7. leetcode 403. 青蛙过河(dp)
  8. linux资源使用统计指南,指南:工作量分析文档
  9. vs升级c++项目遇到的一些问题
  10. 问题集锦13:数据库升级后,程序无法连接数据库
  11. 442个超实用电脑快捷键大全!总有你会用上的
  12. 为什么高级程序员尤其讨厌条条框框的束缚?
  13. nginx rtmp直播无延迟_Ubuntu中使用Nginx+rtmp搭建流媒体直播服务
  14. c语言试题 函数选择,(C语言函数章节选择题.doc
  15. Dynamics 365Online Server-Side OAuth身份认证二(S2S)
  16. mysql sniffer 源码,MySQL Sniffer 是一个基于 MySQL 协议的抓包工具
  17. 快速幂计算x的n次幂,递归版本、迭代版本、python实现
  18. SSM毕设项目校园设备巡检管理系统04b46(java+VUE+Mybatis+Maven+Mysql)
  19. poi修改excel单元格值导致单元格变成橙色的问题(WPS)
  20. Deep High-Resolution Representation Learning for Visual Recognition阅读笔记

热门文章

  1. js把base64串解析成中文_回文问题终极篇:最小代价构造回文串
  2. 三下乡辅导孩子计算机知识,【青春“三下乡”】普及家庭教育知识,共促孩子健康成长...
  3. phpnow 安装apache失败_装PHPnow 提示 apache 安装失败 的解决方法
  4. linux 6.6 最新 gblic,Centos6 升级glibc-2.17,解决Requires: libc.so.6(GLIBC_2.14)(64bit)错误解决方法(推荐)...
  5. java calendar与date_Java中date和calendar的用法
  6. mysql客户端如何创建用户_mysql的创创建用户阶段 开启客户端登录和授权阶段
  7. 大学计算机一级考试报名费,华北电力大学计算机等级考试报名
  8. Android系统的命令行操作及C程序编译
  9. python install scikit-image后,报错ImportError: DLL load failed: 找不到指定的模块
  10. C++:名字空间的使用