1

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

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;
}

所以,我猜 isMemberOfClass 在 NSArray 上是不可能的,可能在其他一些框架类上也是如此。

谢谢。

4

3 回答 3

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:提供更有用的结果。

于 2013-02-16T04:45:50.400 回答
2

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

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

于 2013-02-16T05:09:36.733 回答
-1

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

于 2013-02-16T04:41:51.243 回答