__bridge __bridge_retained __bridge_transfer

当Objective-C对象(Cocoa Framework对象类型,可以自动管理内存)向Core Foundation对象类型(一组C语言接口,需要手动管理内存)转换的时候使用下面这些转换。

1)__bridge只是单纯地执行了类型转换,没有进行所有权的转移。

i). 从Cocoa转换到Core,需要人工CFRetain,否则,Cocoa指针释放后, 传出去的指针则无效。 也就是说,当NSString对象被释放的时候,CFString也不能被使用了.

//Cocoa对象->Core对象
NSString *string = [NSString stringWithFormat:...];
CFStringRef cfString = (__bridge CFStringRef)string;
CFRetain(cfString);
...
...
//最后用完cfString要release
CFRelease(cfString);

ii). 从Core转换到Cocoa,需要人工CFRelease,否则,Cocoa指针释放后,对象引用计数仍为1,不会被销毁。

//Core对象->Cocoa对象
CFStringRef cfString = CFSTR("aa");
NSString *string = (__bridge NSString *)cfString;
//用完就可以release
CFRelease(cfString);

(2)
__bridge_retained (等价于用CFBridgingRetain)可以通过转换目标处(CFString)的 retain 处理,来使所有权转移。即使 string 变量被释放,CFString 还是可以使用具体的对象。只是有一点,由于Core Foundation的对象不属于ARC的管理范畴,所以需要自己release

NSString *string = [NSString stringWithFormat:...];
CFStringRef cfString = (__bridge_retained CFStringRef)string;
...
//需要Release
CFRelease(cfString); 
等价:
CFBridgingRetain 替代 __bridge_retained 
NSString *string = [NSString stringWithFormat:...];
CFStringRef cfString = CFBridgingRetain(string);
...
//需要Release
CFRelease(cfString);

(3)
__bridge_transfer(等价于用CFBridgingRelease)所有权被转移的同时,被转换变量将失去对象的所有权。因为已经用 __bridge_transfer 转移了对象的所有权,所以不需要调用 release

//Core对象->Cocoa对象 
CFStringRef cfString = CFStringCreate...();
NSString *string = (__bridge_transfer NSString *)cfString;
//不需要CFRelease(cfString);
等价:
CFBridgingRelease() 来代替 __bridge_transfer
CFStringRef cfString = CFStringCreate...();
NSString *string = CFBridgingRelease(cfString);
//不需要CFRelease(cfString);

CFStringRef转UTF8 c string的问题

以下上代码在tR3是英语字符情况下可以,一碰到中文就转换失败,返回的cstr为NULL.

 CFStringRef tR3 = CFSTR("我");
    const char* cstr = CFStringGetCStringPtr( tR3, kCFStringEncodingUTF8 );

怎么使用CFString系列的函数将CFStringRef转换成UTF8的C String?

char buf[sizeof(tR3)];
//作用是在一段内存块中填充某个给定的值,它是对较大的结构体或数组进行清零操作的一种最快方法
memset( buf, 0, sizeof(tR3) );
    CFStringGetCString(tR3, buf, sizeof(tR3), kCFStringEncodingUTF8);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值