2019独角兽企业重金招聘Python工程师标准>>>

##[Objective-C]ARC中NSString *与CFStringRef的相互转换

首先看一下典型的NSString与CFStringRef的相互转换

// CFStringRef to NSString *
NSString *yourFriendlyNSString = (__bridge NSString *)yourFriendlyCFString;// NSString * to CFStringRef
CFStringRef yourFriendlyCFString = (__bridge CFStringRef)yourFriendlyNSString;

上面出现了一个关键字 __bridge ,这个关键字便是整个转换的关键。Apple官方对于 __bridge 的解释如下:

__bridge transfers a pointer between Objective-C and Core Foundation with no transfer of ownership.

__bridge 用于Objective-C和Core Foundation指针之间的转换,这种转换不会更换对象的所有权(ownership)。

__bridge_retained or **CFBridgingRetain** casts an Objective-C pointer to a Core Foundation pointer and also transfers ownership to you. You are responsible for calling CFRelease or a related function to relinquish ownership of the object.

__bridge_retained 或 CFBridgeRetain 用于从Objective-C到Core Foundation的指针转换,并且会将对象的所有权(ownership)转移,所以你需要在不再使用该对象的时候调用CFRelease方法来解除引用。

__bridge_transfer or **CFBridgingRelease** moves a non-Objective-C pointer to Objective-C and also transfers ownership to ARC. ARC is responsible for relinquishing ownership of the object.

__bridge_transfer 或 CFBridgeRelease 用于将非Objective-C指针转换为Objective-C指针,对象的所有权(ownership)会交给ARC,这时你无须担心对象何时释放,交给ARC去做就好了。

为什么在使用 __bridge_retained 进行转换时需要自己调用CFRelease来释放对象,其实原因很简单:Core Foundation的对象在ARC的管辖范围之内。

下面是示例代码:

// Don't transfer ownership. You won't have to call `CFRelease`
CFStringRef str =(__bridge CFStringRef)string;
// Transfer ownership (i.e. get ARC out of the way). The object is now yours and you must call `CFRelease` when you're done with it
CFStringRef str =(__bridge_retained CFStringRef)string; // you will have to call `CFRelease`// Don't transfer ownership. ARC stays out of the way, and you must call `CFRelease` on `str` if appropriate (depending on how the `CFString` was created)
NSString*string =(__bridge NSString*)str;
// Transfer ownership to ARC. ARC kicks in and it's now in charge of releasing the string object. You won't have to explicitly call `CFRelease` on `str`
NSString*string =(__bridge\_transfer NSString*)str;

转载于:https://my.oschina.net/u/1993252/blog/847401

[Objective-C]ARC中NSString *与CFStringRef的相互转换相关推荐

  1. Objective C ARC 使用及原理

    Objective C ARC 使用及原理 手把手教你ARC ,里面介绍了ARC的一些特性, 还有将非ARC工程转换成ARC工程的方法 ARC 苹果官方文档 下面用我自己的话介绍一下ARC,并将看文档 ...

  2. ARC中__bridge, __bridge__transfer, __bridge_retained 关系

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

  3. 1.1 objective-c中的内存管理

    备注:本来在一年前有一个出版社找到我,让我写一系列关于iOS性能优化的书.但是一直因为工作原因,没有能够按时交付.(其实就是自己懒)所以现在讲已经写好的部分章节分享到博客中,希望对大家有所帮助,如果有 ...

  4. ARC中的三个关键字

    ARC中,变量可以用三个关键字修饰: __strong: 赋值给这个变量的对象会自动被retain一次,如果在block中引用它,block也会retain它一次. __unsafe_unretain ...

  5. ARC中block块作为属性的使用笔记

    ARC中block块作为属性的使用笔记 block较难理解,根据在内存中的分布情况就分为3种类型,根据使用的情形又分为很多很多种.虽然用起来容易,但使用不当会造成内存泄露,虽然都是这么说,但你真的研究 ...

  6. php中如何比较数组和字符串,PHP中数组和字符串的相互转换-PHP数组和字符串互相转换方法-吾爱编程网...

    网站开发过程中有时候会有一些字符串和数组互转,接下来吾爱编程为大家介绍一下字符串和数组互转的方法,有需要的小伙伴可以参考一下: 1.将字符串转换为数组:/** * 将字符串转换为数组 * @param ...

  7. Java8中 Date和LocalDateTime的相互转换

    转载自  Java8中 Date和LocalDateTime的相互转换 一.在Java 8中将Date转换为LocalDateTime 方法1: 将Date转换为LocalDatetime,我们可以使 ...

  8. java中string和int的相互转换

    java中string和int的相互转换 int -> String int i=12345; String s=""; 核心:s=i+""; Strin ...

  9. oracle11g scn 补丁,Oracle11g中SCN与TimeStamp的相互转换

    Oracle11g中SCN与TimeStamp的相互转换 作为对于闪回操作(flashback)的一个增强,Oracle10g提供了函数对于SCN和时间戳进行相互转换. 获取系统的SCN号 selec ...

  10. c语言字母转换数字代码,实现c语言中字符串和数字的相互转换的代码

    实现c语言中字符串和数字的相互转换的代码 引导语:代码就是程序员用开发工具所支持的语言写出来的源文件,是一组由字符.符号或信号码元以离散形式表示信息的明确的'规则体系.以下是百分网小编分享给大家的实现 ...

最新文章

  1. js,jquery 根据对象某一属性进行排序
  2. 洛谷 P2749 [USACO5.1]【夜空繁星Starry Night】
  3. angularjs的$on、$emit、$broadcast
  4. SAP CRM One Order CLOSING date change debug
  5. 聊聊天,如果能重来,还干不干程序员?
  6. 外链引入css有哪些方式_外链怎么发才会快速收录?
  7. hashmap 遍历_HashMap面试必问的数据结构相关知识总结
  8. ch cc 2019Mac(ch cc 2019直装版)2.1中文特别版
  9. NS2中认知无线电仿真
  10. VSCode使用eclipse快捷键
  11. IntelliJ IDEA配置Groovy教程
  12. MATLAB APP全局变量的使用
  13. Java实现HTML页面截图功能
  14. 答题拿奖两不误:华为云知乎金牌答题官,就是你!
  15. 旗舰手机的拍照芯片(上)
  16. vue使用高德地图关键字搜索功能的实例代码(踩坑经验)
  17. php和durex,PHP语言25周年 杜蕾斯发文庆祝 文案绝了
  18. mongotemplate 多表多条件查询记录
  19. 隐形降权是什么, 什么行为会导致店铺被隐形降权,如何避免降权
  20. 一款个性、实用、无痕的浏览器(大学生的最爱)

热门文章

  1. 【GDB调试学习笔记】GDB查看运行时数据
  2. NSGA-Ⅱ算法C++实现(测试函数为ZDT1)
  3. 普通卷积、转置卷积、空洞卷积(dilated convolution、Atrous Convolution)
  4. 透视形变(perspective distortion)
  5. ArcGIS 道路线数据处理与拓扑操作
  6. 实习成长之路——设计模式四:什么是单一职责原则,如何判定某个类的职责是否够“单一”?
  7. 题目:有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?
  8. java中判断当前日期是星期几
  9. 一个强大的网络库RxEasyHttp
  10. 接口自动化测试框架搭建(7、连接数据库提交sql方法以及打印日志方法封装)--python+HTMLTestRunnerCN+request+unittest+mock+db