2009-07-31 2 views
22

クラスがある場合、インスタンス変数名をすべて一覧表示するにはどうすればよいですか?Objective-Cのオブジェクトのすべてのフィールドを一覧表示するにはどうすればよいですか?

例:

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

私は "ミント"、 "のmyString"、および "MyArrayという" を取得したいと思います。おそらく、私が繰り返し処理できる名前の配列を得るための方法はありますか?

Objective-Cのドキュメントを検索しようとしましたが、何も見つかりませんでした。

+0

は、あなたがソースコードから作業している(その場合、あなたはObjective-Cのパーサーを必要とします)または実行時に(Objective-CランタイムAPIを使用できます)? –

+0

ソースコード、つまり変数は実行時に変更されず、すべてソースコードで定義されます。私はplistに書き出すための一般的な関数を書こうとしています。私はそれを行うためにNSDictionaryを使うことができると知っていますが、私は新しいクラス変数を追加するときに手動でコードを追加することを避けたいので、疑問です。 –

+0

これは実際に実行時に意味するように聞こえます。 –

答えて

40

述べたように、あなたはインスタンス変数名取得するにはObjective-CのランタイムAPIを使用することができます。

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

ありがとうthatsちょうど私が必要なもの。 –

+3

これも必要です:#import

+0

NSManagedObjectではこれが動作しないのはなぜですか? –

0

gen_bridge_metadataは全く異なる目的を意図していますが、Objective-CヘッダーファイルからXMLファイルを生成することができます。

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

無料(vars)を追加する必要があります。上記の@JHHのように、またはあなたは記憶上の問題があります – amergin

関連する問題