如何在Objective-C中列出对象的所有字段?

时间:2009-07-31 17:41:03

标签: objective-c class introspection objective-c-runtime

如果我有一个类,我该如何列出它的所有实例变量名?

例如:

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

我想得到“myInt”,“myString”和“myArray”。有没有办法可以得到一个我可以迭代的名字数组?

我尝试过搜索Objective-C文档但找不到任何内容(我也不确定这是什么)。

3 个答案:

答案 0 :(得分:42)

如上所述,您可以使用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);

答案 1 :(得分:4)

#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);

答案 2 :(得分:0)

考虑gen_bridge_metadata,它用于完全不同的目的,但可以从Objective-C头文件生成XML文件。