为什么iOS 4.0中的数组显示为__NSArrayI(以及如何匹配)?

Sha*_* A. 2 iphone ios4

在以前的iPhoneOSes下,用于将自己标识为NSCFArray的对象现在似乎在运行iOS 4.0的设备下将自己标识为__NSArrayI.

知道这是怎么回事?我在任何文档中都找不到它.

另外,它与"[NSArray class]"不匹配.

它应该是一个简单的数组.它的定义如下:

NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:
                         thisPlayerName,@"name",
                         [NSNumber numberWithInt:[myTable.visiblePlayer.number intValue]],@"number",
                         playerCountArray,@"players",
                         [NSArray arrayWithObjects:@"easy",@"medium",@"hard",nil],@"opponent difficulty",
                         [NSNumber numberWithBool:[cardDecks getOptionBoolForKey:@"seeMoney"]],@"see money",
                         [cardDecks gameSpeedOptions],@"computer turn speed",
                         [NSArray arrayWithObjects:@"aqua",@"green",@"orange",@"purple",@"red",nil],@"player color",
                         nil];
Run Code Online (Sandbox Code Playgroud)

然后输入另一个字典,如下所示:

    myRecord = [[NSMutableDictionary alloc] initWithCapacity:5];
    [myRecord addEntriesFromDictionary:newDictionary];
Run Code Online (Sandbox Code Playgroud)

其他所有类都有我期望的类:NSCFString,NSCFNumber,NSCFBoolean,但不是数组,我无法弄清楚如何匹配它.

Sha*_* A. 9

为什么会这样?因为我们不能信任从一个版本到另一个版本的类的内部名称.

怎么搭配呢?不要尝试匹配类的名称或等同于类.只需使用isKindOfClass:它将匹配一个类及其子类,并为像这样的奇怪变体做正确的事情.

例如:

    } else if ([thisValue isKindOfClass:[NSArray class]]) {
Run Code Online (Sandbox Code Playgroud)

请注意,您要将isKindOfClass:消息发送到对象,而不是 [object class]!