2012-07-11 12 views
7

Come potrei essere in grado di riscrivere la seguente classe di utilità per ottenere tutti i valori di stringa di classe per un tipo specifico - utilizzando i Objective C-runtime funzioni come illustrato di seguito?realloc() & ARC

La documentazione ARC prevede espressamente che realloc dovrebbe essere evitato e ho anche il seguente errore del compilatore in questa questa linea:

classList = realloc(classList, sizeof(Class) * numClasses); 

la conversione implicita di un tipo puntatore non Objective-C 'vuoto" * 'to' __unsafe_unretained Class * 'non è consentito con ARC "

Il seguente codice è un riferimento all'articolo originale che può essere trovato here.

+ (NSArray *)classStringsForClassesOfType:(Class)filterType { 

    int numClasses = 0, newNumClasses = objc_getClassList(NULL, 0); 
    Class *classList = NULL; 

    while (numClasses < newNumClasses) { 
     numClasses = newNumClasses; 
     classList = realloc(classList, sizeof(Class) * numClasses); 
     newNumClasses = objc_getClassList(classList, numClasses); 
    } 

    NSMutableArray *classesArray = [NSMutableArray array]; 

    for (int i = 0; i < numClasses; i++) { 
     Class superClass = classList[i]; 
     do { 
      superClass = class_getSuperclass(superClass); 
      if (superClass == filterType) { 
       [classesArray addObject:NSStringFromClass(classList[i])]; 
       break; 
      }   
     } while (superClass);  
    } 

    free(classList); 

    return classesArray; 
} 

Il vostro aiuto sarà molto apprezzato.

+0

Esegui un elenco di classi cast esplicito (void *). Inoltre, considera di non utilizzare realloc. Cosa stai cercando di realizzare qui? – Dustin

+2

non si ha realmente bisogno di eseguire il codice con ARC, o sarebbe accettabile per voi per eseguire il codice in modalità non-ARC ('-fno-objc-arc' bandiera impostazioni de compilazione di destinazione per le classi in cui si desidera disabilitare ARC). Vedere: http://stackoverflow.com/questions/6646052/how-can-i-disable-arc-for-a-single-file-in-a-project –

+0

@WolfgangSchreurs Grazie, ho completamente dimenticato l'opzione del linker bandiera . – RynoB

risposta

13

ARC obbliga a essere più espliciti con voi la gestione della memoria. In questo caso, devi solo eseguire esplicitamente il cast dell'output di realloc:

classList = (Class *)realloc(classList, sizeof(Class) * numClasses); 
+0

Grazie, questo era esattamente quello che stavo cercando! – RynoB

+0

Grazie per aver risparmiato ore di frustrazione. –