Foundation对象与Core Foundation对象如何转换

1.Foundation对象与Core Foundation对象有什么区别

  Foundation框架是使用OC实现的,Core Foundation是使用C实现的,Foundation对象 和 Core Foundation对象间的转换:俗称桥接。

2. ARC环境如何桥接

  •  __bridge_retained:用于Foundation对象 转成 Core Foundation对象,解除 ARC 所有权
  •  __bridge_transfer: 用于Core Foundation对象 转成 Foundation对象,给予 ARC 所有权
  • __bridge:可用于Foundation对象 和 Core Foundation对象间的转换,不改变对象所有权

>>我们首先看: Foundation对象如何转成 Core Foundation对象?

  •   _bridge桥接

 NSString *strOC1 = [NSString stringWithFormat:@"abcdefg"];
 CFStringRef strC1 = (__bridge CFStringRef)strOC1;
 NSLog(@"%@ %@", strOC1, strC1);
代码中使用了_bridge桥接, 如果使用__bridge桥接,它仅仅是将strOC的地址给了strC, 并没有转移对象的所有权,也就是说, 如果使用__bridge桥接, 那么如果strOC释放了,strC也不能用了, 因为在ARC条件下,如果是使用__bridge桥接,那么strC可以不用主动释放, 因为ARC会自动管理strOC和strC

  • __bridge_retained桥接

 NSString *strOC2 = [NSString stringWithFormat:@"abcdefg"];
 //CFStringRef strC2 = (__bridge_retained CFStringRef)strOC2;
 CFStringRef strC2 = CFBridgingRetain(strOC2);// 这一句, 就等同于上一句
 CFRelease(strC2);
如果使用__bridge_retained桥接,它会将对象的所有权转移给strC, 也就是说, 即便strOC被释放了, strC也可以使用.注意:在ARC条件下,如果是使用__bridge_retained桥接,那么strC必须自己手动释放,因为桥接的时候已经将对象的所有权转移给了strC,而C语言的东西不是不归ARC管理的

>>紧接着来看看: Core Foundation对象如何 转成 Foundation对象?

  • _bridge桥接(和上面类似)

CFStringRef strC3 = CFStringCreateWithCString(CFAllocatorGetDefault(), "12345678", kCFStringEncodingASCII);
NSString *strOC3 = (__bridge NSString *)strC3;
CFRelease(strC3);
如果使用__bridge桥接,它仅仅是将strC的地址给了strOC, 并没有转移对象的所有权,  也就是说如果使用__bridge桥接,那么如果strC释放了,strOC也不能用了。

  • __bridge_transfer桥接

  CFStringRef strC4 = CFStringCreateWithCString(CFAllocatorGetDefault(), "12345678", kCFStringEncodingASCII);
   //NSString *strOC = (__bridge_transfer NSString *)strC;
   NSString *strOC4 = CFBridgingRelease(strC4); // 这一句, 就等同于上一句
如果使用__bridge_transfer桥接,它会将对象的所有权转移给strOC, 也就是说, 即便strC被释放了, strOC也可以使用 。如果使用了__bridge_transfer桥接, 他会自动释放strC, 也就是以后我们不用手动释放strC。

3.MRC环境如何桥接(直接强转)

  -(void)bridgeInMRC
        {
          // 将Foundation对象转换为Core Foundation对象,直接强制类型转换即可
          NSString *strOC1 = [NSString stringWithFormat:@"xxxxxx"];
          CFStringRef strC1 = (CFStringRef)strOC1;
          NSLog(@"%@ %@", strOC1, strC1);
          [strOC1 release];
          CFRelease(strC1);

          // 将Core Foundation对象转换为Foundation对象,直接强制类型转换即可
          CFStringRef strC2 = CFStringCreateWithCString(CFAllocatorGetDefault(), "12345678", kCFStringEncodingASCII);
          NSString *strOC2 = (NSString *)strC2;
          NSLog(@"%@ %@", strOC2, strC2);
          [strOC2 release];
          CFRelease(strC2);
        }

未完待续。。。。。。。。。。。。。。。。。。。。。。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值