Corefoundation学习笔记

delims 于 2020-08-06 发布

做iOS开发一般都使用Foundation框架,很少使用CoreFoundation框架。有一些高级的第三方库中用到一些CoreFoundation框架API的使用。在此总结一些CoreFoundation的使用方法。

typedef const struct CF_BRIDGED_TYPE(NSString) __CFString * CFStringRef;

CFStringRef 是 __CFString 的结构体指针。

使用c字符串创建__CFString

const char *c_str = "hello delims";
CFStringRef cfStr = CFStringCreateWithCString(CFAllocatorGetDefault(), c_str, kCFStringEncodingUTF8);

CFAllocatorGetDefault()用于获取当前线程的默认分配器

创建字符串后在转成c字符串

char buffer[13];
bool succes = CFStringGetCString(cfStr, buffer, 13, kCFStringEncodingUTF8);
if (succes) {
    printf("%s\n",buffer);
}

创建一个用于接收c字符串的buffer,buffer必须足够大到可以容纳字符串和字符串结束符。有12个字符,所以至少需要创建长度13的buffer。转成功后返回true。

typedef const struct CF_BRIDGED_TYPE(NSNumber) __CFNumber * CFNumberRef;

创建 CFNumber

int intValue = 1000;
CFNumberRef number = CFNumberCreate(CFAllocatorGetDefault(), kCFNumberIntType, &intValue);

这两者都是 __CFDictionary 的结构体指针。

typedef const struct CF_BRIDGED_TYPE(NSDictionary) __CFDictionary * CFDictionaryRef;
typedef struct CF_BRIDGED_MUTABLE_TYPE(NSMutableDictionary) __CFDictionary * CFMutableDictionaryRef;

和Foundation一样,分可变不可变,创建一个可变版本

CFMutableDictionaryRef mutableDictRef = CFDictionaryCreateMutable(CFAllocatorGetDefault(), 0, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks);

传入0表示存储的元素数量无限。

把创建的number通过cfStr这个key存入mutableDictRef

CFDictionarySetValue(mutableDictRef, cfStr, number);

从mutableDictRef取出来number,再把number转成int

CFNumberRef number2 = CFDictionaryGetValue(mutableDictRef, cfStr);
int fromCFNumber;
CFNumberGetValue(number2, kCFNumberIntType, &fromCFNumber);
printf("%i",fromCFNumber);

不解释了,一看就懂。

const void *array[] = {cfStr, mutableDictRef};
CFArrayRef arrayRef = CFArrayCreate(CFAllocatorGetDefault(), array, 2, &kCFTypeArrayCallBacks);
CFStringRef stringRef = CFArrayGetValueAtIndex(arrayRef, 0);