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。
网友评论