我正在使用现有的iPhone应用程序,同时需要更改C的代码。
我想在标准C文件中使用字典,简单,我不能使用NSDictionary,编译器说它在c99中无效(因为找不到头文件Foundation / Foundation.h和Foundation / NSDictionary.h),但CFDictionaryRef可用(可以找到并导入coz头CoreFoundation / CoreFoundation.h)。然后我尝试使用CFDictionary,我不能将键值对插入字典中,任何人都可以花一些时间看看下面的代码吗?在此先感谢!!
ps,以下代码的输出为:
字数大小:0 密钥:text.html,值:111
表示未插入键值对...
CFMutableDictionaryRef dict = CFDictionaryCreateMutable(NULL, 0, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks);
printf("Dict size: %d\n", (int)((CFIndex)CFDictionaryGetCount(dict)));
int i = 111;
char c[] = "text.html";
const void *key = &c;
const void *value = &i;
printf("Key: %s, value: %d\n", key, *(int *)value);
CFDictionarySetValue(dict, key, value);
printf("Added\n");
printf("Dict size: %d\n", (int)((CFIndex)CFDictionaryGetCount(dict)));
value = (int *)CFDictionaryGetValue(dict, key);
printf("Value: %d\n", *(int *)value);
感谢您的输入,以下是工作代码。
// init dict CFMutableDictionaryRef dict = CFDictionaryCreateMutable(NULL,0,& kCFTypeDictionaryKeyCallBacks,& kCFTypeDictionaryValueCallBacks);
//insert key-value
int i = 111;
const void *value = &i;
CFDictionaryAddValue(dict, CFSTR("text.html"), CFNumberCreate(NULL, kCFNumberSInt32Type, value));
CFNumberRef valueRef = CFDictionaryGetValue(dict, CFSTR("text.html"));
//get value based on key
int valuePtr;
CFNumberGetValue(valueRef, kCFNumberSInt32Type, (void *)&valuePtr);
printf("value: %d\n", valuePtr);
答案 0 :(得分:1)
使用CFMutableDictionaryRef
作为参数创建的&kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks
期望Core Foundation类型为键和值,因为它会尝试保留/释放它们(使用CFRetain
/ CFRelease
)。
您应该使用CFStringRef
和CFNumberRef
代替纯C类型(或者,指定其他keyCallBacks
和valueCallBacks
,可能NULL
)。