提高性能之——Core Foundation

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)