2012-01-04 9 views
17

¿Alguien ha logrado usar objc_getClassList en arco, sin apagar el arco para el archivo en cuestión?Usando objc_getClassList bajo el arco

El problema fundamental es que uno de los parámetros es una matriz C de punteros de clase.

+0

Buena pregunta. ARC parece bastante incómodo en situaciones como esta. Lo deshabilité para el archivo en cuestión, en lugar de perder el tiempo para descubrir cómo bailar alrededor de él, pero como tú, me gustaría saber si hay una forma relativamente directa de hacerlo con ARC habilitado. – jlehr

Respuesta

32

Este código debe trabajar bajo 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

Como nota, si desea utilizar uno de los objetos de Clase fuera del contexto donde ejecuta este código (por ejemplo, como un retorno de una función que usa esto), puede obtener una clase administrada de memoria ARC de la clase __unsafe_unretained haciendo NSClassFromString (NSStringFromClass (classes [i])). No estoy seguro de si hay una manera más eficiente de obtener una copia de clase, pero de esa manera parece funcionar para mí. Si solo devuelve las clases [i] directamente, terminará con un puntero colgando ya que el objeto se libera en la llamada gratuita (clases). – stuckj

Cuestiones relacionadas