前奏

在平常开发中,我们可能遇到 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 使用注意的更多相关文章

  1. [Objective-C]__bridge,__bridge_retained和__bridge_transfer的意思,区别与使用

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

  2. 关于block以及__bridge的一些笔记

    问题概要 _block是否是一个OC对象? __bridge相关. _block是否是一个OC对象? 结论 一般来说,block可以看做一个OC对象,但是在编译器底层,block又可以被细分为bloc ...

  3. ARC __bridge modifiers demystified

    http://stackoverflow.com/questions/14207960/arc-bridge-modifiers-demystified Because I learned what ...

  4. 浅解ARC中的 __bridge、__bridge_retained和__bridge_transfer

    文章来源:http://www.outflush.com/2015/03/introduction-of-arc-bridge-type-transfer/ 在对 bridge 相关的修饰符解说前.首 ...

  5. __bridge,__bridge_transfer和__bridge_retained的使用和区别【转载】

    __bridge,__bridge_transfer和__bridge_retained的使用和区别[转载] Core Foundation 框架Core Foundation框架 (CoreFoun ...

  6. IOS的__bridge

    使用 __bridge 关键字来实现id类型与void*类型的相互转换.看下面的例子. id obj = [[NSObject alloc] init]; void *p = (__bridge vo ...

  7. expected expression __bridge

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/u013020103/article/details/30491117 expected expres ...

  8. __bridge

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

  9. ARC中__bridge, __bridge__transfer, __bridge_retained 关系

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

随机推荐

  1. Vim插件推荐

    看下文时要知道我的<leader>键就是\. ctags C程序阅读辅助工具.在看C/C++代码的时候经常需要在文件之间跳来跳去,这是很麻烦的事,ctags就是解决这种问题的.ctags是 ...

  2. Selenium入门15 截图

    截图方法: 1 保存截图 get_screenshot_as_file('保存路径\\文件名.png')     #有一个\是转义符 2 保存截图 save_screenshot('保存路径\\文件名 ...

  3. Ubuntu中在QT中配置OpenGL

    之前搞实验室项目,博客有些天没有更新.现在学习需要,开始搞OpenGL+Ubuntu+QT. 搞了整整一天,由于是首次使用ubuntu,所以这ubuntu下配置qt和Opengl环境时走了很多的弯路, ...

  4. innerHTML动态添加html代码和脚本兼容性问题处理方法

    给某个元素的innerHTML赋值,并使得值中的js代码有效(兼容多个浏览器) 症状:给某个元素的 innerHTML 设置值时,如果提供的 HTML 代码中包含js脚本,很多时候这些脚本无效,或者在 ...

  5. css3弹性盒子

    CSS3 弹性盒子(Flex Box) 弹性盒子是 CSS3 的一种新的布局模式. CSS3 弹性盒( Flexible Box 或 flexbox),是一种当页面需要适应不同的屏幕大小以及设备类型时 ...

  6. 字符串处理,Poj(2121)

    题目链接:http://poj.org/problem?id=2121 差一点就WA哭了,主要是自己傻逼了. 思路: 遇到hundred,sum*100; 但是遇到thouthend,million, ...

  7. 在idea中配置jetty

    第一步:在pom.xml中配置jetty插件 <plugins> <!-- jetty插件 --> <plugin> <groupId>org.mort ...

  8. 奇异值分解(SVD)和最小二乘解在解齐次线性超定方程中的应用

    奇异值分解,是在A不为方阵时的对特征值分解的一种拓展.奇异值和特征值的重要意义相似,都是为了提取出矩阵的主要特征. 对于齐次线性方程 A*X =0;当A的秩大于列数时,就需要求解最小二乘解,在||X| ...

  9. P2082 区间覆盖(加强版)

    题目 #include<iostream> #include<algorithm> #include<cstring> using namespace std; s ...

  10. leetCode没那么难啦 in Java (一)

    前言    感觉写博客是一个很耗心力的东西T_T,简单的写了似乎没什么用,复杂的三言两语也只能讲个大概,呸呸...怎么能有这些消极思想呢QAQ!那想来想去,先开一个leetcode的坑,虽然已经工作了 ...