首页 > __bridge 使用注意

__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



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

更多相关:

  • 使用前要AfxInitRichEdit2(); 修改背景颜色和字体颜色 CRichEditCtrl* p=(CRichEditCtrl*)GetDlgItem(IDC_RICHEDIT21);CHARFORMAT2 cf;memset((char*)&cf,0,sizeof(cf));COLORREF color;color...

  • 更多内容,欢迎关注微信公众号:全菜工程师小辉~前言在笔者上一篇博客,详解了NIO,并总结NIO相比BIO的效率要高的三个原因,彻底搞懂NIO效率高的原理。这篇博客将针对第三个原因,进行更详细的讲解。首先澄清,零拷贝与内存直接映射并不是Java中独有的概念,并且这两个技术并不是等价的。零拷贝零拷贝是指避免在用户态(User-space)...

  • 一、预备知识—程序的内存分配  一个由c/C++编译的程序占用的内存分为以下几个部分  1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈,如果还不清楚,那么就把它想成数组,它的内存分配是连续分配的,即,所分配的内存是在一块连续的内存区域内.当我们声明变量时,那么编译器...

  • 我的爱机是一台ThinkPad T420,原装三星DDR 1333 4G内存一根,还剩一根内存位置,最近趁京东6.18促销,准备增加一根物理内存。为了确保兼容性,觉得仍然选购DDR 1333 4G内存,于是购买了金士顿这款,比如DDR3 1600的还贵。 这个安装过程完全参照该内存的网页提示进行 这里简单记录一下,以备...

  • 陪伴我多年的老本ThinkPad T420渐渐垂垂老矣, 我想更新一下可以更新的部分, 比如将2.5寸HDD更换为SSD, 将单条4G内存再增加一根, 凡此种种想法, 可能最后归结为如何获取该笔记本的硬件配置信息, 在windows下面使用鲁大师之类的检测软件, 也许很好搞定,但是在Ubuntu 14.04平台上如果办到呢? 很简单...

  • 一.内存错误出现的场景 这几天在重构ATS插件代码的过程中遇到了烦人的内存泄露问题, 周五周六连续两天通过走查代码的方法,未能看出明显的导致内存错误的代码, 同时也觉得C和C++混合编程得到一个动态库, 在一个.cpp主文件中,即用new又用malloc来动态分配内存, 可能会导致内存错误.后来网上调研和查资料发现, new和mal...