0

我有一个 NSMutableArray,创建如下:

NSMutableArray *expr = [[NSMutableArray alloc] init]; 
    [expr addObject:[NSNumber numberWithDouble:3.0]];
    [expr addObject:@"+"];
    [expr addObject:@"%x"];
    [expr addObject:@"*"];
    [expr addObject:[NSNumber numberWithDouble:4.0]];

稍后,我将它传递给称为 的方法(id) anExpression,并尝试通过自省来确定这是什么类型的对象:

if ([[anExpression class] isEqual:[NSMutableArray class]]) {
    // Some code I only want to do if it IS a Mutable array
}

但是,这返回 false,并且我的代码没有被执行。NSLog我试过[NSMutableArray class]了,这给了我NSMutableArray。并不意外。
但是当我尝试NSLogingexpr的课程时,我得到了__NSArrayM.

为什么是这样?我应该如何解决这个问题?

我对Objective-C不太熟悉,所以请解释一下。我不喜欢做我不明白的事情。

4

2 回答 2

1

你的支票不正确。它应该是

if ([[expr class] isEqual:[NSMutableArray class]]) {

或者

if ([expr isKindOfClass:[NSMutableArray class]]) {
于 2012-06-26T15:47:14.830 回答
1

答案在于 isKindOfClass - 如果您创建了 NSMutableArray 的子类,显然您希望执行为可变数组保留的代码。

同样,必须有一些内部 Cocoa 实现细节,其中您制作的可变数组的类与 [NSMutableArray 类] 不同。我不知道原因,但你也不应该关心,你几乎总是想使用 isKindOfClass - 它也适用于子类。

如果你真的想知道...

都是关于类集群的-请参阅Objective c isKindOfClass misunderstanding?

于 2012-06-26T15:57:58.567 回答