如何测试Objective-C中的对象属于哪个类?


207

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

Answers:


345

要测试object是否是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.

要获取对象的类名,可以使用NSStringFromClassfunction:

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

编辑:在斯威夫特

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

69
不要忘记为class_getName()#import <objc / runtime.h>导入
Ovesh'2

6
为此,还有一个类方法
亚历山大·沃林

3
我的理解是,这仅适用于继承NSObject的对象。
Henrik P. Hessel

1
@afEkenholm-但不是在iOS 4.x上,我们知道。
JJ Rohrer

2
使用class_getNameover有NSStringFromClass什么好处?如果没有,则应调整此答案。
丹·罗森斯塔克

21

您也可以使用

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

在任何NSObject上


8
根据程序员是否重写了描述方法,这可能有效,也可能无效。但是,使用[object class]或NSStringFromClass总是返回类名。
futureelite7

1
非常适合调试和了解神秘对象的类型!
M Jesse

3

Apple文档中的isKindOfClass意味着什么

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

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

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


您的示例代码不正确。如果您要测试NSArray,那只会遇到问题,因为它仍然是不可变的。如果要测试特定的类,则应改用isMemberOfClass。
futureelite7 2014年

@ futureelite7这是一个测试类类型的示例。在苹果文档,各国-isKindOfClass:-isMemberOfClass:不应被用于一类集群内识别物体。
pxpgraphics


1

如果您想获取类的名称,只需调用:-

id yourObject= [AnotherClass returningObject];

NSString *className=[yourObject className];

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

0

您还可以检查运行时间。在代码中放置一个断点,然后在内部(lldb)控制台中写入

(lldb) po [yourObject class]

像这样..

在此处输入图片说明

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.