技术文档

iOS开发 CoreFoundation与Foundation的

2018-03-13  本文已影响7人  沐灵洛

CoreFoundation与Foundation的桥接

方法一:_ _Bridge:可以将CF对象转换为Foundation对象(只做类型转换),但不会移交对象的所有权。需求通过CFRelease手动释放CF对象。简言之:只做类型转换,但是不修改对象(内存)管理权

1.CF转Foundation:

CFStringRef cfString = CFStringCreate...();

NSString *string = (__bridge NSString *)cfString;

//CF框架没有ARC机制

CFRelease(cfString);

2.Foundation转CF:

NSString *string = [NSString stringWithFormat:...];

CFStringRef cfString = (__bridge CFStringRef)string;

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

方法二:_ _Bridge_Transfer/CFBridgingRelease:可以将CF对象转换为Foundation对象同时移交对象的所有权。由OC负责对象的内存管理(ARC有效时,自动释放)。简言:将Core Foundation的对象转换为Objective-C的对象,同时将对象(内存)的管理权交给ARC。

1.CFBridgingRelease

CFStringRef cfString = CFStringCreate...();

NSString *string = CFBridgingRelease(cfString);

2._ _Bridge_Transfer

CFStringRef cfString = CFStringCreate...();

NSString *string = (__bridge_transfer NSString *)cfString;

方法三:_ _Bridge_retained/CFBridgingRetain:可以将Foundation对象转换为CF对象(转换后自动调用CFRetain,后续由我们调用CFRelease进行释放),并有CF框架负责内存管理。

1._ _Bridge_retained:

NSString *string = [NSString stringWithFormat:...];

CFStringRef cfString = (__bridge_retained CFStringRef)string;

...

CFRelease(cfString); // 由于Core Foundation的对象不属于ARC的管理范畴,所以需要自己release

1.CFBridgingRetain:

NSString *string = [NSString stringWithFormat:...];

CFStringRef cfString = CFBridgingRetain(string);

...

CFRelease(cfString); // 由于Core Foundation不在ARC管理范围内,所以需要主动release。

上一篇 下一篇

猜你喜欢

热点阅读