如何在Objective-C中测试对象是哪个类?

时间:2010-01-13 10:28:57

标签: objective-c

如何在Objective-C中测试对象是否是特定类的实例?假设我想看看对象a是b类的实例,还是类c,我该怎么做呢?

6 个答案:

答案 0 :(得分:342)

测试对象是否是类a的实例:

[yourObject isKindOfClass:[a class]]
// Returns a Boolean value that indicates whether the receiver is an instance of 
// given class or an instance of any class that inherits from that class.

[yourObject isMemberOfClass:[a class]]
// Returns a Boolean value that indicates whether the receiver is an instance of a 
// given class.

要获取对象的类名,可以使用NSStringFromClass函数:

NSString *className = NSStringFromClass([yourObject class]);
来自objective-c运行时api的

或c函数:

#import <objc/runtime.h>

/* ... */

const char* className = class_getName([yourObject class]);
NSLog(@"yourObject is a: %s", className);

编辑:在Swift中

if touch.view is UIPickerView {
    // touch.view is of type UIPickerView
}

答案 1 :(得分:21)

您也可以使用

NSString *className = [[myObject class] description]; 

在任何NSObject上

答案 2 :(得分:3)

Apple文档中 isKindOfClass 的含义是什么

在类集群表示的对象上使用此方法时要小心。由于类集群的性质,您获得的对象可能并不总是您期望的类型。如果调用返回类集群的方法,则该方法返回的确切类型是您可以对该对象执行的操作的最佳指示。例如,如果方法返回指向NSArray对象的指针,则不应使用此方法来查看该数组是否可变,如以下代码所示:

// DO NOT DO THIS!
if ([myArray isKindOfClass:[NSMutableArray class]])
{
    // Modify the object
}

如果在代码中使用此类构造,您可能认为修改实际上不应修改的对象是可以的。这样做可能会为期望对象保持不变的其他代码产生问题。

答案 3 :(得分:3)

如果您想检查特定课程,可以使用

if([MyClass class] == [myClassObj class]) {
//your object is instance of MyClass
}

答案 4 :(得分:1)

如果你想获得班级名称,只需致电: -

id yourObject= [AnotherClass returningObject];

NSString *className=[yourObject className];

NSLog(@"Class name is : %@",className);

答案 5 :(得分:0)

您还可以检查运行时间。在代码和内部(lldb)控制台写入

中放置一个断点
(lldb) po [yourObject class]

喜欢这个..

enter image description here