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

fut*_*te7 207 objective-c

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

Vla*_*mir 344

要测试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.
Run Code Online (Sandbox Code Playgroud)

要么

[yourObject isMemberOfClass:[a class]]
// Returns a Boolean value that indicates whether the receiver is an instance of a 
// given class.
Run Code Online (Sandbox Code Playgroud)

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

NSString *className = NSStringFromClass([yourObject class]);
Run Code Online (Sandbox Code Playgroud)

或来自objective-c运行时api的c函数:

#import <objc/runtime.h>

/* ... */

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

编辑:在斯威夫特

if touch.view is UIPickerView {
    // touch.view is of type UIPickerView
}
Run Code Online (Sandbox Code Playgroud)

  • 不要忘记#import <objc/runtime.h> for class_getName() (69认同)
  • 为此,还有[类方法](http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSObject_Class/Reference/Reference.html). (6认同)
  • 我的理解是这只适用于继承NSObject的对象. (3认同)
  • 在`NSStringFromClass`上使用`class_getName`有什么好处?如果没有,则应调整此答案. (2认同)

Cle*_*t M 21

你也可以使用

NSString *className = [[myObject class] description]; 
Run Code Online (Sandbox Code Playgroud)

在任何NSObject上

  • 根据程序员是否覆盖了描述方法,这可能会也可能不会起作用.但是,使用[object class]或NSStringFromClass总是返回类名. (8认同)