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


测试对象是否是类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.

or

[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 runtime 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
}

你也可以用

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

在任何NSObject上


在苹果文档中isKindOfClass是什么意思

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

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

如果在代码中使用这样的构造,您可能会认为修改一个实际上不应该修改的对象是可以的。这样做可能会给其他希望对象保持不变的代码带来问题。


如果你想检查一个特定的类,那么你可以使用

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

如果你想获得类的名称,只需调用:-

id yourObject= [AnotherClass returningObject];

NSString *className=[yourObject className];

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

您还可以检查运行时。在代码中放入一个断点并在(lldb)控制台中写入

(lldb) po [yourObject class]

像这样的. .