开发者

How to enumerate CFProperyList / CFDictionary keys

开发者 https://www.devze.com 2022-12-20 06:32 出处:网络
I would like to iterate through a CFDictionary (CFPropertyList) and get all values on a specific level.

I would like to iterate through a CFDictionary (CFPropertyList) and get all values on a specific level.

This would be my dictionary / property-list:


 root
 
  A
  
   foo
   0
   bar
   0
  
  B
  
   foo
   10
   bar
   100
  
  C
  
   foo
   20
   bar
   500
  
 

Using ObjC it would look something like this:

//dict is loaded with the dictionary below "开发者_StackOverflowroot"
NSDictionary *dict = [...];
NSEnumerator *enumerator = [dict keyEnumerator];
NSString *key;
while (key = [enumerator nextObject]) 
{
    NSLog(key);
};

And it would print out a list of keys to the console like this:

A
B
C

How do you achieve this when using C/C++ on the CoreFoundation-level?


Use CFDictionaryApplyFunction to iterate through a dictionary.

static void printKeys (const void* key, const void* value, void* context) {
  CFShow(key);
}
...
CFDictionaryApplyFunction(dict, printKeys, NULL);


Based on code from 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;

You can now walk through the pointers in keys[]. Don't forget to free(keys) when you're done.

Remember that dictionary keys are not strings. They're void* (which is why they took the trouble of casting keysTypeRef into keys). Also note that I've only grabbed keys here, but you could also get values at the same time. See the SeeMyFriends code for a more detailed example.


CFCopyDescription is helpful when Debugging...

CFCopyDescription
Returns a textual description of a Core Foundation object.

    CFStringRef CFCopyDescription (
       CFTypeRef cf
    );
0

精彩评论

暂无评论...
验证码 换一张
取 消