__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 对象之 ...
随机推荐
- Vim插件推荐
看下文时要知道我的<leader>键就是\. ctags C程序阅读辅助工具.在看C/C++代码的时候经常需要在文件之间跳来跳去,这是很麻烦的事,ctags就是解决这种问题的.ctags是 ...
- Selenium入门15 截图
截图方法: 1 保存截图 get_screenshot_as_file('保存路径\\文件名.png') #有一个\是转义符 2 保存截图 save_screenshot('保存路径\\文件名 ...
- Ubuntu中在QT中配置OpenGL
之前搞实验室项目,博客有些天没有更新.现在学习需要,开始搞OpenGL+Ubuntu+QT. 搞了整整一天,由于是首次使用ubuntu,所以这ubuntu下配置qt和Opengl环境时走了很多的弯路, ...
- innerHTML动态添加html代码和脚本兼容性问题处理方法
给某个元素的innerHTML赋值,并使得值中的js代码有效(兼容多个浏览器) 症状:给某个元素的 innerHTML 设置值时,如果提供的 HTML 代码中包含js脚本,很多时候这些脚本无效,或者在 ...
- css3弹性盒子
CSS3 弹性盒子(Flex Box) 弹性盒子是 CSS3 的一种新的布局模式. CSS3 弹性盒( Flexible Box 或 flexbox),是一种当页面需要适应不同的屏幕大小以及设备类型时 ...
- 字符串处理,Poj(2121)
题目链接:http://poj.org/problem?id=2121 差一点就WA哭了,主要是自己傻逼了. 思路: 遇到hundred,sum*100; 但是遇到thouthend,million, ...
- 在idea中配置jetty
第一步:在pom.xml中配置jetty插件 <plugins> <!-- jetty插件 --> <plugin> <groupId>org.mort ...
- 奇异值分解(SVD)和最小二乘解在解齐次线性超定方程中的应用
奇异值分解,是在A不为方阵时的对特征值分解的一种拓展.奇异值和特征值的重要意义相似,都是为了提取出矩阵的主要特征. 对于齐次线性方程 A*X =0;当A的秩大于列数时,就需要求解最小二乘解,在||X| ...
- P2082 区间覆盖(加强版)
题目 #include<iostream> #include<algorithm> #include<cstring> using namespace std; s ...
- leetCode没那么难啦 in Java (一)
前言 感觉写博客是一个很耗心力的东西T_T,简单的写了似乎没什么用,复杂的三言两语也只能讲个大概,呸呸...怎么能有这些消极思想呢QAQ!那想来想去,先开一个leetcode的坑,虽然已经工作了 ...