2012-01-04 4 views
17

Qualcuno è riuscito a utilizzare objc_getClassList sotto arc, a corto di arco per il file in questione?Utilizzo di objc_getClassList sotto l'arco

Il problema fondamentale è che uno dei parametri è un array C di puntatori di classe.

+0

Buona domanda. ARC sembra abbastanza imbarazzante in situazioni come questa. L'ho disabilitato per il file in questione, piuttosto che passare il tempo per capire come ballare intorno ad esso, ma come te sarei curioso di sapere se c'è un modo relativamente semplice per farlo con ARC abilitato. – jlehr

risposta

32

Questo codice dovrebbe funzionare sotto ARC:

int numClasses; 
Class *classes = NULL; 

classes = NULL; 
numClasses = objc_getClassList(NULL, 0); 
NSLog(@"Number of classes: %d", numClasses); 

if (numClasses > 0) 
{ 
    classes = (__unsafe_unretained Class *)malloc(sizeof(Class) * numClasses); 
    numClasses = objc_getClassList(classes, numClasses); 
    for (int i = 0; i < numClasses; i++) { 
     NSLog(@"Class name: %s", class_getName(classes[i])); 
    } 
    free(classes); 
} 
+2

Come nota, se si desidera utilizzare uno degli oggetti Class al di fuori del contesto in cui viene eseguito questo codice (ad esempio, come ritorno da una funzione che lo utilizza), è possibile ottenere una classe gestita dalla memoria ARC dalla classe __unsafe_unretained eseguendo NSClassFromString (NSStringFromClass (classes [i])). Non sono sicuro che esista un modo più efficiente per ottenere una copia di Class, ma in quel modo sembra funzionare per me. Se restituisci le classi direttamente [i], finirai con un puntatore che penzola poiché l'oggetto viene liberato nella chiamata libera (classi). – stuckj