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