__bridge 使用注意
前奏
在平常开发中,我们可能遇到 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
__bridge 使用注意的更多相关文章
- [Objective-C]__bridge,__bridge_retained和__bridge_transfer的意思,区别与使用
使用ARC能帮我们减轻不少内存管理方面的负担,尤其是对用惯了Java的程序员来说.但是像我这种Java基础本身就不牢固,做了两年的iOS已经习惯手动管理内存的半吊子,使用ARC还是经常碰壁. 对于CF ...
- 关于block以及__bridge的一些笔记
问题概要 _block是否是一个OC对象? __bridge相关. _block是否是一个OC对象? 结论 一般来说,block可以看做一个OC对象,但是在编译器底层,block又可以被细分为bloc ...
- ARC __bridge modifiers demystified
http://stackoverflow.com/questions/14207960/arc-bridge-modifiers-demystified Because I learned what ...
- 浅解ARC中的 __bridge、__bridge_retained和__bridge_transfer
文章来源:http://www.outflush.com/2015/03/introduction-of-arc-bridge-type-transfer/ 在对 bridge 相关的修饰符解说前.首 ...
- __bridge,__bridge_transfer和__bridge_retained的使用和区别【转载】
__bridge,__bridge_transfer和__bridge_retained的使用和区别[转载] Core Foundation 框架Core Foundation框架 (CoreFoun ...
- IOS的__bridge
使用 __bridge 关键字来实现id类型与void*类型的相互转换.看下面的例子. id obj = [[NSObject alloc] init]; void *p = (__bridge vo ...
- expected expression __bridge
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/u013020103/article/details/30491117 expected expres ...
- __bridge
Core Foundation 框架Core Foundation框架 (CoreFoundation.framework) 是一组C语言接口,它们为iOS应用程序提供基本数据管理和服务功能.下面列举 ...
- ARC中__bridge, __bridge__transfer, __bridge_retained 关系
总结于 IOS Tuturial 中 ARC两章,详细在dropbox pdf 文档. Toll-Free Bridging 当你在 Objective-C 和 Core Foundation 对象之 ...
随机推荐
- mysql 5.6 zip安装,启动失败,1067错误
在使用mysql5.6 zip压缩包安装mysql过程中,启动过程,老是卡在1067启动错误上,翻看网上各种解决方案,卸载干净重装,重启,都不管用. 网上各种教程都是新建 my.ini mysql 配 ...
- OpenGL学习 Our First OpenGL Program
This shows you how to create the main window with the book’s application framework and how to render ...
- framework7滑动删除列表触发chrome 报错解决办法
使用 <div class="list-block"> <ul> <li class="swipeout"> <div ...
- OpenCV2马拉松第5圈——线性滤波
收入囊中 这里的非常多内容事实上在我的Computer Vision: Algorithms and ApplicationsのImage processing中都有讲过 相关和卷积工作原理 边界处理 ...
- Centos下Yum安装PHP5.5,5.6
默认的版本太低了,手动安装有一些麻烦,想采用Yum安装的可以使用下面的方案: 1.检查当前安装的PHP包 yum list installed | grep php 如果有安装的PHP包,先删除他们 ...
- mac home brew install go
mac利器home brew安装Go 首先你得需要安装home brew和ruby环境(因为home brew依赖ruby) 如果没有请自行到链接安装 准备好之后就开始安装go了 brew updat ...
- Spring Quartz *.QRTZ_LOCKS' doesn't exist
ERROR [org.springframework.web.context.ContextLoader] - Context initialization failedorg.springframe ...
- django中的构造字典(二级菜单,评论树,购物车)
1.构造父子结构: 1.1需求样式 客户列表 customer_list /customer/list/ -----> 添加客户 customer_add /customer/add/ ---- ...
- 深入浅出:了解jsonp跨域的九种方式
什么是“”跨域”: 跨域访问,简单来说就是 A 网站的 javascript 代码试图访问 B 网站,包括提交内容和获取内容.由于安全原因,跨域访问是被各大浏览器所默认禁止的.当一个域与其他域建立了信 ...
- Spring 中IOC(控制反转)&& 通过SET方式为属性注入值 && Spring表达式
### 1. Spring IoC IoC:Inversion of control:控制反转:在传统开发模式下,对象的创建过程和管理过程都是由开发者通过Java程序来实现的,操作权在开发者的Java ...