提高性能之——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);
        
    }
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,496评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,407评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,632评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,180评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,198评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,165评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,052评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,910评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,324评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,542评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,711评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,424评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,017评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,668评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,823评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,722评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,611评论 2 353

推荐阅读更多精彩内容