提高性能之——Core Foundation

作者: sea777777 | 来源:发表于2016-11-08 16:19 被阅读1399次

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

    • 群体数据类型 (数组、集合等)
    • 程序包
    • 字符串管理
    • 日期和时间管理
    • 原始数据块管理
    • 偏好管理
    • URL及数据流操作
    • 线程和RunLoop
    • 端口和soket通讯
    /************** CFString ***************/
        
        /**
         * CFString 是基于 unicode 的存储容器,提供丰富高效的操作、搜索、和转国际化字符串的功能;
         * CFString 既没有 create 也没有 copy,所以无需 realease;
         **/
        CFStringRef str = CFSTR("HELLO");
        CFArrayRef array = CFArrayCreate(NULL, (const void**)&str, 1, &kCFTypeArrayCallBacks);
        
        CFShow(str);
        CFShow(array);
        CFShowStr(str);
        
        
        
        const char *cstring = "hello c";
        CFStringRef string = CFStringCreateWithCString(NULL, cstring, kCFStringEncodingUTF8);
        CFShow(string);
        CFRelease(string);
    

    或者使用下面这个方法:

    /**
         * 或者使用下面这个方法
         *
         **/
        //定义一个结构体
        struct Buffer{
            UInt8 length;
            UInt8 data[];
        };
        //初始化结构体
        static struct Buffer buffer = {
            6,{'B','U','F','F','E','R'}
        };
        
        CFStringRef string2 = CFStringCreateWithPascalString(NULL, (ConstStr255Param)&buffer, kCFStringEncodingUTF8);
        CFShow(string2);
        CFRelease(string2);
        
        
        //这种方式同上,根据不同需求调用不同方法
        CFStringRef string3 = CFStringCreateWithBytes(NULL, buffer.data, buffer.length, kCFStringEncodingUTF8, false);
        CFShow(string3);
        CFRelease(string3);
    
        
        
        //方法1: 转为c字符串,有可能会返回NULL
        const char *string4 = CFStringGetCStringPtr(string3, kCFStringEncodingUTF8);
        
        
        //方法2:
        char * buff = NULL;
        const char * cstring1 = NULL;
        cstring1 = getStringOfUTF8(CFSTR("good"), &buff);
        printf("%s\n", cstring1);
        free(buff);
    

    字符串复制:

    /*********************** 字符串复制 ***********************/
        /** 一般缓冲区的字符串会继续使用,所以需要复制到新的CFString中 **/
        
        /***** 方式一 ******/
        {
            /**
             * 复制字符串
             * NoCopy 不会创建新的内存空间,节省内存,提高效率;
             * string5 持有缓冲区,所以由 string5 来释放内存;
             **/
            const char *cstr = "How are you!";
            char *bytes = malloc(strlen(cstr) + 1);
            strcpy(bytes, cstr);//cstr 拷贝到 bytes 数组
            
            //传入 kCFAllocatorMalloc 负责销毁 bytes 缓冲区,无需自己手动释放 bytes 缓冲区;
            CFStringRef string5 = CFStringCreateWithCStringNoCopy(NULL, bytes, kCFStringEncodingUTF8, kCFAllocatorMalloc);
            CFShow(string5);
            CFRelease(string5);
            
            //这里会输出 0
            NSLog(@"%lu", strlen(bytes));
        }
    
     /*****  方式二 ******/
        {
            /**
             * 复制字符串
             * NoCopy 不会创建新的内存空间,节省内存,提高效率;
             * string5 持有缓冲区,所以由 string5 来释放内存;
             **/
            const char *cstr = "How are you!";
            char *bytes = malloc(strlen(cstr) + 1);
            strcpy(bytes, cstr);//cstr 拷贝到 bytes 数组
            //传入 kCFAllocatorNull , 不进行销毁 bytes 缓冲区,但要自己手动释放 bytes 缓冲区
            CFStringRef string5 = CFStringCreateWithCStringNoCopy(NULL, bytes, kCFStringEncodingUTF8, kCFAllocatorNull);
            CFShow(string5);
            CFRelease(string5);
            
            //这里会输出 12 ;
            NSLog(@"%lu", strlen(bytes));
        
        }
    

    CFArray

    /********* CFArray  ************/
        
        {
            //不可变长度的数组
            CFStringRef strings[3] = { CFSTR("HOW") ,CFSTR("ARE"),CFSTR("YOU")};
            CFArrayRef array = CFArrayCreate(NULL, (void*)strings, 3, &kCFTypeArrayCallBacks);
            CFShow(array);
            CFRelease(array);
            
            //可变长度的数组
            CFMutableArrayRef mutableArray = CFArrayCreateMutable(NULL, 0, &kCFTypeArrayCallBacks);
        }
    
     /************* CFDictionary *************/
        {
            CFStringRef keys[3] = {CFSTR("key1"), CFSTR("key2"),CFSTR("key3")};
            CFStringRef values[3] ={CFSTR("value1"),CFSTR("value2"),CFSTR("value3")};
            CFDictionaryRef dict = CFDictionaryCreate(NULL,
                                                      (void*)keys,
                                                      (void*)values,
                                                      3,
                                                      &kCFTypeDictionaryKeyCallBacks,
                                                      &kCFTypeDictionaryValueCallBacks);
        
            CFShow(dict);
            //创建 CFMutableDictionary 和 CFDictionaryRef 类似...
    
        
        }
    

    允许数组存放NULL值

     
        {
            //创建 数组, 并允许存入 NULL 值;
            //如果需要存放 NULL 值,则用 kCFNull 常量来代替;
            
            CFArrayCallBacks callBacks = kCFTypeArrayCallBacks;
            // 设置为NULL ,意味着允许数组可以放入NULL 值;如果不设置 NULL ,放入 NULL值会崩溃;
            callBacks.retain =NULL;
            callBacks.release= NULL;
            CFArrayRef array =  CFArrayCreateMutable(NULL, 0, &callBacks);
            CFStringRef string = CFStringCreateWithCString(NULL, "stuff", kCFStringEncodingUTF8);
            CFArrayAppendValue(array, string);
            CFShow(array);
            CFRelease(array);
            CFRelease(string);
        }
    

    判定value是否存在:

    {
    
    CFMutableDictionaryRef dict = CFDictionaryCreateMutable(NULL, 0, NULL, &kCFTypeDictionaryValueCallBacks);
    CFDictionarySetValue(dict, NULL, CFSTR("Foo"));
    
    const void *value;
    // 给定一个 key ,看是否存在;
    Boolean fooPresent0 = CFDictionaryGetValueIfPresent(dict, NULL, &value);// 这个是存在的
    Boolean fooPresent1 = CFDictionaryGetValueIfPresent(dict, CFSTR("888"), &value);//这个是不存在的
    
    printf("fooPresent: %d\n", fooPresent0);
    printf("fooPresent: %d\n", fooPresent1);
    
    // printf("values equal: %d\n", CFEqual(value, CFSTR("Foo")));
    
    CFRelease(dict);
    
    }
    

    自由桥连接:

     {
            /*******  自由桥连接  ************/
            
            //把 oc 对象转成 C 对象;
            NSArray *arr = [NSArray arrayWithObjects:@"test", nil];
            NSLog(@"-----%ld",CFArrayGetCount((__bridge CFArrayRef)arr));
            
            //把 C 对象转成 oc 对象;
            CFMutableArrayRef cfArray = CFArrayCreateMutable(NULL, 0, &kCFTypeArrayCallBacks);
            CFArrayAppendValue(cfArray, CFSTR("HELLO"));
            NSUInteger count = [(__bridge id)cfArray count];
            printf("count=  %lu  \n", (unsigned long)count);
            CFRelease(cfArray);
            
            
            
            CFStringRef cfString = CFStringCreateWithCString(NULL, "WO CA", kCFStringEncodingUTF8);
            
            //把c 转成 oc 对象,并释放cfstring的所有权, 教给了 arc来引用;
            //并且把引用计数 -1,来平衡 CFStringCreateWithCString;
            NSString *ocStr = CFBridgingRelease(cfString);
            NSLog(@"-----ocStr:%@",ocStr);
            
            //oc 转 c
            NSString *nsString = [[NSString alloc]initWithFormat:@"NICE"];
            CFStringRef cString = CFBridgingRetain([nsString copy]);
            nsString = nil;
            
            CFShow(cString);
            CFRelease(cString);
            
        }
    

    相关文章

      网友评论

        本文标题:提高性能之——Core Foundation

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