• Core Foundation框架介绍


    Core Foundation框架介绍

    **参考网址:

    ARC下OC对象和CF对象之间的桥接

    Core Foundation框架介绍

    Core Foundation框架

    Core Foundation框架 (CoreFoundation.framework) 是一组C语言接口,它们为iOS应用程序提供基本数据管理和服务功能。下面列举该框架支持进行管理的数据以及可提供的服务:

    • 群体数据类型 (数组、集合等)
    • 程序包
    • 字符串管理
    • 日期和时间管理
    • 原始数据块管理
    • 偏好管理
    • URL及数据流操作
    • 线程和RunLoop
    • 端口和soket通讯

    Core Foundation框架和Foundation框架紧密相关,它们为相同功能提供接口,但Foundation框架提供Objective-C接口。如果您将Foundation对象和Core Foundation类型掺杂使用,则可利用两个框架之间的 “toll-free bridging”。所谓的Toll-free bridging是说您可以在某个框架的方法或函数同时使用Core Foundatio和Foundation 框架中的某些类型。很多数据类型支持这一特性,其中包括群体和字符串数据类型。每个框架的类和类型描述都会对某个对象是否为 toll-free bridged,应和什么对象桥接进行说明。

    如需进一步信息,请阅读Core Foundation 框架参考

    ARC下OC对象和CF对象之间的桥接(bridge)

    ARC仅管理Objective-C指针(retain、release、autorelease),不管理CoreFoundation指针,CF指针由人工管理,手动的CFRetain和CFRelease来管理,注,CF中没有autorelease。

    1. __bridge:CF和OC对象转化时只涉及对象类型不涉及对象所有权的转化

      NSURL *url = [[NSURL alloc] initWithString:@"http://www.baidu.com"];
      CFURLRef ref = (CFURLRef)url;
      

      上面的这段代码在ARC环境下系统会给出错误提示和错误修正,修正后如下:

      NSURL *url = [[NSURL alloc] initWithString:@"http://www.baidu.com"];
      CFURLRef ref = (__bridge CFURLRef)url;
      

      系统为我们自动添加了__bridge,因为是OC创建的对象并且在转换时没有涉及对象所有权的转换,所以上面的代码不需要加CFRelease

    2. __bridge_transfer:常用在将CF对象转换成OC对象时,将CF对象的所有权交给OC对象,此时ARC就能自动管理该内存;(作用同CFBridgingRelease())

    3. __bridge_retained:(与__bridge_transfer相反)常用在将OC对象转换成CF对象时,将OC对象的所有权交给CF对象来管理;(作用同CFBridgingRetain())

      NSURL *url = [[NSURL alloc] initWithString:@"http://www.baidu.com"];
      CFURLRef ref = (__bridge_retained CFURLRef)url;
      CFRelease(ref);
      

      当使用_bridge_retained标识符以后,代表OC要将对象所有权交给CF对象自己来管理,所以我们要在ref使用完成以后用CFRelease将其手动释放.

      CFStringRef cfString= CFURLCreateStringByAddingPercentEscapes(
                                                                NULL,
                                                                (__bridge         CFStringRef)text,
                                                                NULL,
                                                                CFSTR("!      *’();:@&=+$,/?%#[]"),  CFStringConvertNSStringEncodingToEncoding(NSUTF8StringEncoding));
      NSString *ocString = (__bridge_transfer CFStringRef)cfString;
      

      此时OC即获得了对象的所有权,ARC负责自动释放该对象,如果我们在结尾加上CFRelease(cfString)纯属画蛇添足,虽不会崩溃,但是控制台会打印出该对象被free了两次。

  • 相关阅读:
    docker 单kafka ,多分区
    spring data jpa + mysql使用json 类型
    C++ Multithread Tutorial
    GDB 调试程序
    C++ Project 积累(四)
    GDB 调试 C/C++ Project
    makefile 学习(一)
    Ubuntu 下配置 boost + eclipse
    C++ Project 积累(3)
    Leetcode Sudoku Solver
  • 原文地址:https://www.cnblogs.com/AbeDay/p/5026939.html
Copyright © 2020-2023  润新知