Foundation对象与CoreFoundation对象的区别

Foundation对象与CoreFoundation对象的区别

Foundation对象是OC对象,使用OC语言实现;而Core Foundation 对象是 C 对象,使用C语言实现,两者之间可以通过 __ bridge、__ bridge _ transfer、__ bridge _ retained等关键字转换桥接

Foundation对象和 Core Foundation 对象更重要的区别是ARC下的内存管理问题。在非ARC下两者都需要开发者手动管理内存,没有区别,但是在ARC下系统只会自动管理Foundation对象的释放,而不支持Core Foundation对象的管理。因此在ARC下两者进行转换后必须要确定的对象是由开发者手动管理还是ARC系统继续管理,否则可能导致内存泄露。

下面以NSString对象(Foundation对象)和CFStringRef对象(Core Foundation)为例,介绍两者转换和内存管理的移交问题

  • 在非ARC 下,NSSting对象和CFStringRef对象可以直接进行转换都是手动管理无须担心内存问题

  • 在ARC下,NSString对象和CFStringRef对象转换是,需要使用 __ bridge、__ bridge _ transfer、__ bridge _ retained 来确定对象管理权限转义问题

1 . __ bridge最常用,他的含义是不改变对象的管理权所有者本来由ARC管理的Foundation对象,转换成Core Foundation 对象后依旧由ARC管理;本来有开发者手动管理的Core Foundation 对象转换成Foundation 对象后继续由开发者手动管理代码如下

// ARC下管理的Foundation对象

NSString * s1 = @"hello";

// 转换后依旧由ARC管理释放

CFStringRef cfstring = (__bridge CFStringRef)s1;`

//开发者手动管理的CoreFoundation对象

CFStringRef s2 = CFStringCreateWithCString(NULL, "hello", kCFStringEncodingASCII);

//转换后依旧由开发者手动管理释放

 NSString * fstring = (__bridge NSString*)s2;

2 . __ bridge _ transfer用在将Core Foundation 对象转换成 Foundation 对象时,用于进行内存管理权的移交,即本需要由开发者手动管理释放的Core Foundation 对象转换成 Foundation 对象后,交由ARC来管理对象的释放,开发者不用再关心对象的释放问题因为不会发生内存问题 如下

//开发者手动管理的CoreFoundation对象

CFStringRef s2 = CFStringCreateWithCString(NULL, "hello", kCFStringEncodingASCII);

//转换后不需要由开发者手动管理

 NSString * fstring = (__bridge_transfer NSString*)s2;
//Write the same way.
// NSString * fstring = (NSString*)CFBridgingRelease(s2);

3 . __ bridge _ retained用在将 Foundation 对象转换成 Core Foundation 对象时,进行ARC内存管理权的剥夺,即本来有ARC管理的Foundation 对象在转换成CoreFoundation对象后,ARC不再继续管理该对象,需要开发者手动进行释放该对象 不然会发生内存泄露 如下

//ARC下管理的Foundation对象

NSString * s1 = @"hello";

//转换后ARC不再继续管理,需要手动释放

CFStringRef cfstring = (__bridge_retained CFStringRef)s1;
//write the same way
// CFStringRef cfstring = (CFStringRef)CFBridgingRetain(s1);
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,142评论 1 32
  • 源代码下载 下载地址:苹果公开的源代码在这里可以下载,https://opensource.apple.com/t...
    小码僧阅读 2,136评论 0 4
  • 什么是Automatic Reference Counting? Automatic Reference Coun...
    癫癫的恋了阅读 3,156评论 3 23
  • ARC是一个编译器特征,它提供了对OC对象自动管理内存。ARC让开发者专注于感兴趣的代码和对象的关系,而不用考虑对...
    jiaoguifeng阅读 560评论 0 1
  • 有一种心情,叫喜怒哀乐;有一种味道,叫酸甜苦辣咸;有一种智慧,叫深谋远虑;有一种缘份,叫天长地久;有一个群体,叫烟...
    心目助梦阅读 283评论 0 3