isMemberOfClass的用法;返回假

时间:2013-02-16 04:40:08

标签: objective-c

在下面的代码中,我认为第二个条件是真的,但结果却是假的。我错过了什么吗?请帮我理解。

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上是不可能的,也可能在其他一些框架类上。

感谢。

3 个答案:

答案 0 :(得分:3)

这是正确的行为。尝试检查该对象的实际类:

NSArray *array = [[NSArray alloc] init];
NSLog(@"%@", NSStringFromClass([array class]));

您获得的输出类似于:

2013-02-15 23:42:31.272 Project[91998:c07] __NSArrayI

所以实际的类是__NSArrayINSArray的私有子类),而不是NSArray本身。通常,isKindOfClass:会提供更有用的结果。

答案 1 :(得分:2)

NSArray是一个类集群。当您创建NSArray的对象时,它在内部从其集群创建对象。它增加了简单性,以避免根据要求创建不同类型的对象。

对于这种情况,您应该使用函数isKindOfClass。它检查完成者层次结构以识别对象的类型。

答案 2 :(得分:-1)

您应该使用isKindOfClass。请参阅this了解差异。