美文网首页技术文档
iOS开发 CoreFoundation与Foundation的

iOS开发 CoreFoundation与Foundation的

作者: 沐灵洛 | 来源:发表于2018-03-13 11:40 被阅读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。

    相关文章

      网友评论

        本文标题:iOS开发 CoreFoundation与Foundation的

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