首页 技术 正文
技术 2022年11月12日
0 收藏 734 点赞 4,943 浏览 2645 个字

iOS同意Objective-C 和 Core Foundation 对象之间能够轻松的转换:

  1. CFStringRef aCFString = (CFStringRef)aNSString;
  2. NSString *aNSString = (NSString *)aCFString;

针对内存管理问题,ARC 能够帮忙管理 Objective-C 对象, 可是不支持 Core Foundation 对象的管理。所以转换后要注意一个问题:谁来释放使用后的对象。 本文重点总结一下类型转换后的内存管理。

一、非ARC的内存管理

倘若不使用ARC。手动管理内存,思路比較清晰,使用完,release转换后的对象就可以。

  1. //NSString 转 CFStringRef
  2. CFStringRef aCFString = (CFStringRef) [[NSString alloc] initWithFormat:@"%@", string];
  3. //…
  4. CFRelease(aCFString);
  5. //CFStringRef 转 NSString
  6. CFStringRef aCFString = CFStringCreateWithCString(kCFAllocatorDefault,
  7. bytes,
  8. NSUTF8StringEncoding);
  9. NSString *aNSString = (NSString *)aCFString;
  10. //…
  11. [aNSString release];

二、ARC下的内存管理

ARC的诞生大大简化了我们针对内存管理的开发工作。可是仅仅支持管理 Objective-C 对象, 不支持 Core Foundation 对象。

Core Foundation 对象必须使用CFRetain和CFRelease来进行内存管理。那么当使用Objective-C 和 Core Foundation 对象相互转换的时候,必须让编译器知道,究竟由谁来负责释放对象,是否交给ARC处理。仅仅有正确的处理。才干避免内存泄漏和double
free导致程序崩溃。

依据不同需求,有3种转换方式

  • __bridge                  (不改变对象全部权)
  • __bridge_retained 或者 CFBridgingRetain()              (解除 ARC 全部权)

  • __bridge_transfer 或者 CFBridgingRelease()            (

    给予 ARC 全部权)

1. __bridge_retained 或者 CFBridgingRetain()

__bridge_retained 或者 CFBridgingRetain()  将Objective-C对象转换为Core Foundation对象,把对象全部权桥接给Core Foundation对象,同一时候剥夺ARC的管理权。兴许须要开发人员使用CFRelease或者相关方法手动来释放对象。

来看个样例:

  1. – (void)viewDidLoad
  2. {
  3. [super viewDidLoad];
  4. NSString *aNSString = [[NSString alloc]initWithFormat:@"test"];
  5. CFStringRef aCFString = (__bridge_retained CFStringRef) aNSString;
  6. //正确的做法应该运行CFRelease
  7. //CFRelease(aCFString);
  8. }

程序没有运行CFRelease,造成内存泄漏:

CFBridgingRetain()  是 __bridge_retained 的宏方法。以下两行代码等价:

  1. CFStringRef aCFString = (__bridge_retained CFStringRef) aNSString;
  2. CFStringRef aCFString = (CFStringRef) CFBridgingRetain(aNSString);

2. __bridge_transfer 或者 CFBridgingRelease()

__bridge_transfer 或者 CFBridgingRelease()  将非Objective-C对象转换为Objective-C对象,同一时候将对象的管理权交给ARC。开发人员无需手动管理内存。

接着上面那个内存泄漏的样例,再转成OC对象交给ARC来管理内存,无需手动管理,也不会出现内存泄漏:

  1. – (void)viewDidLoad
  2. {
  3. [super viewDidLoad];
  4. NSString *aNSString = [[NSString alloc]initWithFormat:@"test"];
  5. CFStringRef aCFString = (__bridge_retained CFStringRef) aNSString;
  6. aNSString = (__bridge_transfer NSString *)aCFString;
  7. }

CFBridgingRelease() 是__bridge_transfer的宏方法。以下两行代码等价:

  1. aNSString = (__bridge_transfer NSString *)aCFString;
  2. aNSString = (NSString *)CFBridgingRelease(aCFString);

3. __bridge

__bridge 仅仅做类型转换。不改变对象全部权。是我们最经常使用的转换符。

从OC转CF,ARC管理内存:

  1. – (void)viewDidLoad
  2. {
  3. [super viewDidLoad];
  4. NSString *aNSString = [[NSString alloc]initWithFormat:@"test"];
  5. CFStringRef aCFString = (__bridge CFStringRef)aNSString;
  6. }

从CF转OC,须要开发人员手动释放,不归ARC管: 

  1. – (void)viewDidLoad
  2. {
  3. [super viewDidLoad];
  4. CFStringRef aCFString = CFStringCreateWithCString(NULL, "test", kCFStringEncodingASCII);
  5. NSString *aNSString = (__bridge NSString *)aCFString;
  6. CFRelease(aCFString);
  7. }
相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:8,914
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,438
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,252
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,063
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:7,698
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:4,734