我想遍历CFDictionary(CFPropertyList)并获取特定级别的所有值。
这将是我的字典/属性列表:
root
A
foo
0
bar
0
B
foo
10
bar
100
C
foo
20
bar
500
使用ObjC看起来像这样:
//dict is loaded with the dictionary below "root"
NSDictionary *dict = [...];
NSEnumerator *enumerator = [dict keyEnumerator];
NSString *key;
while (key = [enumerator nextObject])
{
NSLog(key);
};
它会打印出控制台的键列表,如下所示:
A B C
在CoreFoundation级别使用C / C ++时,如何实现这一目标?
答案 0 :(得分:42)
使用CFDictionaryApplyFunction
迭代字典。
static void printKeys (const void* key, const void* value, void* context) {
CFShow(key);
}
...
CFDictionaryApplyFunction(dict, printKeys, NULL);
答案 1 :(得分:11)
基于SeeMyFriends的代码:
CFDictionaryRef dict = CFDictionaryCreate(...)
size size = CFDictionaryGetCount(dict);
CFTypeRef *keysTypeRef = (CFTypeRef *) malloc( size * sizeof(CFTypeRef) );
CFDictionaryGetKeysAndValues(dict, (const void **) keysTypeRef, NULL);
const void **keys = (const void **) keysTypeRef;
您现在可以浏览keys[]
中的指针。完成后不要忘记free(keys)
。
请记住,字典键不是字符串。他们是void*
(这就是为什么他们把keysTypeRef
投射到keys
中的麻烦。另请注意,我只在这里抓取了键,但您也可以同时获取值。有关更详细的示例,请参阅SeeMyFriends代码。
答案 2 :(得分:4)
调试时CFCopyDescription很有用......
CFCopyDescription
Returns a textual description of a Core Foundation object.
CFStringRef CFCopyDescription (
CFTypeRef cf
);