如何在Objective-C中在运行时获取类信息?

时间:2009-11-15 18:26:06

标签: objective-c cocoa

我有NSMutableArray,其中包含不同类的不同对象。现在我想获取类名,相关内容,并检查相应的对象是否为NSString。我应该怎么做呢?

我正在尝试以下内容。它当然不起作用。

for(NSString *string in array){
    NSLog(@"Name of the class : %@", [NSString stringWithCString:class_getName(Class id)];

3 个答案:

答案 0 :(得分:6)

如果您使用的是Mac OS X,则可以使用[object className],它会返回NSString

for(id obj in array) NSLog(@"Name of the class: %@", [obj className]);

要检查它是否是NSString,您应该使用以下内容:

for(id obj in array) {
    if ([obj isKindofClass:[NSString class]]) {
        // do something
    }
}

答案 1 :(得分:6)

for(id object in array){
    NSLog(@"Name of the class: %@", [object className]);
    NSLog(@"Object is a string: %d", [object isKindOfClass:[NSString class]]);
}

查看NSObject classprotocol以了解其他有趣的方法。

答案 2 :(得分:1)

  

我有NSMutableArray,其中包含不同类的不同对象。现在我想得到班级名称&相关的东西&还要检查相应的对象是否为NSString。

坚持。为什么首先要有一系列不同类型的对象?您可以重做您的设计以避免陷入这种情况吗?

正如其他人所说,-isKindOfClass:有效。一个缺点是它通常导致脆弱的代码。在这里你的循环需要知道数组中可能存在的所有类。有时这是你能做的最好的事情。

使用-respondsToSelector的设计:往往更健壮一点。在这里你的循环需要知道它依赖于数组中的类的行为。