如何测试Objective-C中的对象是哪个类?
如何测试对象是否是Objective-C中特定类的实例?假设我想看看对象a是类b的实例,还是类c的实例,我该怎么做?要测试对象是否是类a的实例:如何测试Objective-C中的对象是哪个类?,objective-c,Objective C,如何测试对象是否是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 f
[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.
或
要获取对象的类名,可以使用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);
你也可以使用
NSString *className = [[myObject class] description];
在任何NSObject上关于的意思是苹果文档中的类 在类集群表示的对象上使用此方法时要小心。由于类集群的性质,您返回的对象可能并不总是您期望的类型。如果您调用一个返回类集群的方法,那么该方法返回的确切类型就是您可以对该对象执行的操作的最佳指示器。例如,如果方法返回指向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]
像这样
别忘了#为类_getName()导入也有这样的功能。我的理解是,这只适用于继承NSObject的对象。@afEkenholm-但在iOS 4.x上不适用,正如我们所知。使用
类_getName
比使用NSStringFromClass
有什么好处?如果没有,则应调整此答案。这可能有效,也可能无效,取决于程序员是否重写了描述方法。使用[object class]或NSStringFromClass总是返回类名。这有助于调试和了解神秘对象的类型!您的示例代码不正确。只有在测试NSArray时才会遇到问题,NSArray无论如何都是不可变的。如果要测试特定的类,应该使用isMemberOfClass。@futureelite7这是一个如何不测试类类型的示例。-isKindOfClass:
&-isMemberOfClass:
的状态不应用于标识类集群中的对象。
id yourObject= [AnotherClass returningObject];
NSString *className=[yourObject className];
NSLog(@"Class name is : %@",className);
(lldb) po [yourObject class]