在Objective-C中,如何测试对象类型?

我需要测试对象的类型是否为NSStringUIImageView。我怎样才能做到呢?是否存在某种类型的“isoftype”方法?

261962 次浏览

如果你的对象是myObject,并且你想测试它是否为NSString,代码将是:

[myObject isKindOfClass:[NSString class]]

同样地,如果你想测试myObject是否有UIImageView:

[myObject isKindOfClass:[UIImageView class]]

你可能会用

- (BOOL)isKindOfClass:(Class)aClass

这是一个NSObject的方法。

要了解更多信息,请查看NSObject文档。

这就是你使用它的方法。

BOOL test = [self isKindOfClass:[SomeClass class]];

你也可以尝试这样做

for(id element in myArray)
{
NSLog(@"=======================================");
NSLog(@"Is of type: %@", [element className]);
NSLog(@"Is of type NSString?: %@", ([[element className] isMemberOfClass:[NSString class]])? @"Yes" : @"No");
NSLog(@"Is a kind of NSString: %@", ([[element classForCoder] isSubclassOfClass:[NSString class]])? @"Yes" : @"No");
}

运行一个简单的测试,我想我应该记录哪些有效,哪些无效。我经常看到人们检查对象的类是否属于另一个类,或者是否等于另一个类。

对于下面这行,我们有一些格式不佳的数据,可能是NSArrayNSDictionary(null)

NSArray *hits = [[[myXML objectForKey: @"Answer"] objectForKey: @"hits"] objectForKey: @"Hit"];

这些是执行的测试:

NSLog(@"%@", [hits class]);


if ([hits isMemberOfClass:[NSMutableArray class]]) {
NSLog(@"%@", [hits class]);
}


if ([hits isMemberOfClass:[NSMutableDictionary class]]) {
NSLog(@"%@", [hits class]);
}


if ([hits isMemberOfClass:[NSArray class]]) {
NSLog(@"%@", [hits class]);
}


if ([hits isMemberOfClass:[NSDictionary class]]) {
NSLog(@"%@", [hits class]);
}


if ([hits isKindOfClass:[NSMutableDictionary class]]) {
NSLog(@"%@", [hits class]);
}


if ([hits isKindOfClass:[NSDictionary class]]) {
NSLog(@"%@", [hits class]);
}


if ([hits isKindOfClass:[NSArray class]]) {
NSLog(@"%@", [hits class]);
}


if ([hits isKindOfClass:[NSMutableArray class]]) {
NSLog(@"%@", [hits class]);
}

isKindOfClass运行得相当好,而isMemberOfClass则没有。

当你想要区分父类和继承类时,你可以使用:

if([myTestClass class] == [myInheritedClass class]){
NSLog(@"I'm the inheritedClass);
}
if([myTestClass class] == [mySuperClass class]){
NSLog(@"I'm the superClass);
}

在这种情况下使用- (BOOL)isKindOfClass:(Class)aClass两次都会导致TRUE,因为inheritedClass也是一种超类。

如果您想检查基本数据类型的类型,可以使用以下代码。

// Returns 0 if the object type is equal to double
strcmp([myNumber objCType], @encode(double))

很简单,[youobjectclass]它将返回你的对象的类名。