在下面的代码中,我认为第二个条件是真的,但结果却是假的。我错过了什么吗?请帮我理解。
NSArray *array = [[NSArray alloc] init];
NSLog(@"%@", NSStringFromClass([array class]));
if ([array isMemberOfClass:[NSObject class]]) {
NSLog(@"Member NSObject"); //Didn't print;
}
if ([array isMemberOfClass:[NSArray class]]) {
NSLog(@"Member NSArray"); //Didn't print; I don't understand why?
}
if ([array isKindOfClass:[NSObject class]]) {
NSLog(@"Kind of NSObject"); //Printed; Expected
}
if ([array isKindOfClass:[NSArray class]]) {
NSLog(@"Kind of NSArray"); //Printed; Expected
}
修改
我创建了NSArray的子类作为MyArray,并使用isMemberOfClass测试了它的实例,如下所示
if ([myArray isMemberOfClass:[MyArray class]]) {
NSLog(@"Member MyArray"); //Printed;
}
所以,我想isAmberOfClass在NSArray上是不可能的,也可能在其他一些框架类上。
感谢。
答案 0 :(得分:3)
这是正确的行为。尝试检查该对象的实际类:
NSArray *array = [[NSArray alloc] init];
NSLog(@"%@", NSStringFromClass([array class]));
您获得的输出类似于:
2013-02-15 23:42:31.272 Project[91998:c07] __NSArrayI
所以实际的类是__NSArrayI
(NSArray
的私有子类),而不是NSArray
本身。通常,isKindOfClass:
会提供更有用的结果。
答案 1 :(得分:2)
NSArray是一个类集群。当您创建NSArray的对象时,它在内部从其集群创建对象。它增加了简单性,以避免根据要求创建不同类型的对象。
对于这种情况,您应该使用函数isKindOfClass
。它检查完成者层次结构以识别对象的类型。
答案 2 :(得分:-1)
您应该使用isKindOfClass。请参阅this了解差异。