2009-07-31 13 views
22

Si tengo una clase, ¿cómo puedo enumerar todos sus nombres de variable de instancia?¿Cómo enumero todos los campos de un objeto en Objective-C?

por ejemplo:

@interface MyClass : NSObject { 
    int myInt; 
    NSString* myString; 
    NSMutableArray* myArray; 
} 

me gustaría llegar "myInt", "miCadena", y "miMatriz". ¿Hay alguna forma de tal vez obtener una variedad de nombres sobre los que pueda iterar?

He intentado buscar en la documentación de Objective-C pero no he podido encontrar nada (y tampoco estoy seguro de cómo se llama).

+0

¿Estás trabajando desde el código fuente (en cuyo caso se necesita un analizador de Objective-C) o durante el tiempo de ejecución (en cuyo caso puede usar la API de tiempo de ejecución de Objective-C)? –

+0

Código fuente, es decir. las variables no cambiarán durante el tiempo de ejecución y están todas definidas en el código fuente. Intento escribir una función general para escribir en un plist. Sé que puedo usar NSDictionary para hacer eso, pero me gustaría evitar añadir código manualmente cuando agregue una nueva variable de clase, de ahí la pregunta. –

+0

Suena como si realmente quisieras en el tiempo de ejecución. –

Respuesta

40

Como se ha mencionado, se puede utilizar la API de Objective-C en tiempo de ejecución para recuperar la instancia nombres de variables:

unsigned int varCount; 

Ivar *vars = class_copyIvarList([MyClass class], &varCount); 

for (int i = 0; i < varCount; i++) { 
    Ivar var = vars[i]; 

    const char* name = ivar_getName(var); 
    const char* typeEncoding = ivar_getTypeEncoding(var); 

    // do what you wish with the name and type here 
} 

free(vars); 
+0

Gracias eso es justo lo que necesitaba. –

+3

Lo necesitará también: # import

+0

¿Por qué esto no funciona para NSManagedObject? –

0

Considere gen_bridge_metadata, que tiene un propósito completamente diferente, pero puede producir archivos XML desde archivos de encabezado Objective-C.

1
#import <objc/runtime.h> 


NSUInteger count; 
Ivar *vars = class_copyIvarList([self class], &count); 
for (NSUInteger i=0; i<count; i++) { 
    Ivar var = vars[i]; 
    NSLog(@"%s %s", ivar_getName(var), ivar_getTypeEncoding(var)); 
} 
free(vars); 
+1

Necesita agregar gratis (vars); como @JHH arriba o tienes un problema de memoria – amergin

Cuestiones relacionadas