12
votes

Comment énumérer les clés CFProPertylist / CFDictionary

J'aimerais itérer via un CFdictionary (CFPropertylist) et obtenez toutes les valeurs sur un niveau spécifique.

Ce serait mon dictionnaire / liste de propriétés: p> xxx pré>

Utiliser objc, il ressemblerait à quelque chose comme ceci: p> xxx pré>

et imprimerait une liste des touches de la console comme ceci: p>

A
B
C


0 commentaires

3 Réponses :


12
votes

Basé sur le code de Seemelyfriends :

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;


6 commentaires

Merci un tas - qui a fait le travail.


La méthode CFDictionaryGetKeSandvaluesSandvalues ​​prend un pointeur sur un pointeur sur un tableau des clés. Pourquoi, alors, ne passez-vous pas l'adresse du pointeur "KeyStypeef" (qui serait un pointeur sur ce pointeur)?


CFDictionaryGetKetkeysandvalues ​​ prend un pointeur AA sur un tableau de pointeurs ( Void ** ), pas un pointeur sur un pointeur sur un tableau de pointeurs ( Void *** ). N'oubliez pas que cftyperef est un pointeur.


Pouvez-vous développer? Ce lien est en panne.


Voir la réponse de KennyTM, qui est une approche plus facile que de le faire à la main.


Si vous ne voulez pas seulement imprimer les valeurs (ou les imprimer plus agréables), vous devrez peut-être rechercher le type de chaque propriété. Un exemple de cela est dans Stackoverflow.com/a/17981965/1904815 .



46
votes

Utiliser CFDictionaryApplyfunction code> Pour itérer via un dictionnaire.

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


1 commentaires

D'accord. Une excellente approche pour une grande variété de problèmes.



4
votes

CFCOPYDescription est utile lors du débogage ...

CFCopyDescription
Returns a textual description of a Core Foundation object.

    CFStringRef CFCopyDescription (
       CFTypeRef cf
    );


0 commentaires