美文网首页
Core Foundation对象与Foundation对象转换

Core Foundation对象与Foundation对象转换

作者: Trigger_o | 来源:发表于2018-10-23 11:48 被阅读0次

CF是由C语言实现的,而不是Objective-C,所以如果用到了CF,就需要手动管理内存,ARC是无能为力的。当然因为CF和Foundation之间的友好关系,它们之间的管理权也是可以移交的.

Core Foundation中类型都是不透明类型(opaque type)。在Core Foundation中只能只使用对象的引用,基类型CFTypeRef实际上是一个void*类型,这样将某些变量定义成CFTypeRef类型可以便于实现一些函数的多态性。(比如CFEqual,CFHash,CFRelease,CFRetain等函数)

除了CFTypeRef,其他不透明类型都是结构体,常见的组合如下:

typedef const struct __CFString * CFStringRef;

typedef strct __CFString * CFMutableStringRef;

这样编译器可以检查const的正确性,但是需要注意这里不是真正的继承。在Core Foudation中,如果一个类有几个子类,那么它一般就是void*类型。比如CFPropertyListRef子类有(CFString,CFDate,CFNumber)。好在这种情况并不多,大部分类型都是struct或者const struct。

使用__bridge来转换oc对象和cf对象

有三个方法__bridge ,__bridge_retained和__bridge_transfer

NSString*str =@"aaa";

//    CFStringRef cfstr1 = (__bridge CFStringRef)str;//不转移所有权

1.__bridge只是单纯地执行了类型转换,没有进行所有权的转移,也就是说,当string对象被释放的时候,cfString也不能被使用了。

CFStringRef cfstr = (__bridge_retained CFStringRef)str;//转移所有权

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

CFRelease(cfstr);//转移所有权ARC不再管理 手动释放

//    CFStringRef cfstr = CFBridgingRetain(str); 作用与上面相同

实际上,Core Foundation 内部,为了实现Core Foundation对象类型与Objective-C对象类型的相互转换,提供了这个函数。

idobj = (__bridge_transferid)p;

3.__bridge_retained 是编译器替我们做了 retain 操作,而 __bridge_transfer 是替我们做了 release。

相关文章

网友评论

      本文标题:Core Foundation对象与Foundation对象转换

      本文链接:https://www.haomeiwen.com/subject/zpwozftx.html