2009-07-31 6 views
22

Se ho una classe, come posso elencare tutti i suoi nomi di variabili di istanza?Come elenco tutti i campi di un oggetto in Objective-C?

esempio:

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

vorrei ottenere "myInt", "myString", e "myArray". C'è un modo per ottenere una serie di nomi che posso ripetere?

Ho provato a cercare la documentazione di Objective-C ma non sono riuscito a trovare nulla (e non sono sicuro di come sia chiamato).

+0

stai lavorando dal codice sorgente (in questo caso hai bisogno di un parser Objective-C) o durante il runtime (nel qual caso è possibile utilizzare l'API runtime Objective-C)? –

+0

Codice sorgente, es. le variabili non cambieranno durante il runtime e sono tutte definite nel codice sorgente. Sto cercando di scrivere una funzione generale per scrivere a un plist. So che posso usare NSDictionary per farlo, ma vorrei evitare di aggiungere manualmente il codice dappertutto quando aggiungo una nuova variabile di classe, da qui la domanda. –

+0

Sembra quindi che tu intenda realmente in fase di esecuzione. –

risposta

40

Come accennato, è possibile utilizzare l'API Objective-C runtime per recuperare l'istanza nomi delle variabili:

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

Grazie, è proprio quello di cui avevo bisogno. –

+3

È necessario anche questo: #import

+0

Perché questo non funziona per NSManagedObject? –

0

Considerare gen_bridge_metadata, che è destinato a uno scopo completamente diverso, ma può produrre file XML da file di intestazione 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

È necessario aggiungere gratuitamente (vars); come @JHH sopra o hai un problema di memoria – amergin