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);
}