【问题标题】:SIGABRT on NSDictionary objectAtIndex: unrecognized selectorNSDictionary objectAtIndex 上的 SIGABRT:无法识别的选择器
【发布时间】:2012-08-23 14:56:29
【问题描述】:

我在这里遇到了一个奇怪的错误。 我有一个名为 __ImageData 的数组:

static NSArray *__ImageData = nil;
NSString *path = [[NSBundle mainBundle] pathForResource:@"ImageData" ofType:@"plist"];
NSData *plistData = [NSData dataWithContentsOfFile:path];
NSString *error; NSPropertyListFormat format;
_ImageData = [NSPropertyListSerialization propertyListFromData:plistData
                                              mutabilityOption:NSPropertyListImmutable
                                                        format:&format
                                              errorDescription:&error];

当我 NSLog 输出数组的内容时,我得到这个输出:

2012-08-23 16:36:35.573 CAT[28814:c07] {
    "Item 0" =     {
        height = 7121;
        name = Map1;
        width = 8556;
    };
    "Item 1" =     {
        height = 7121;
        name = Map2;
        width = 8556;
    };
    "Item 2" =     {
        height = 7121;
        name = Map3;
        width = 8556;
    };
}

但是当我 NSLog out NSLog(@"%@", [__ImageData objectAtIndex:0]); 时,我得到了这个异常:

2012-08-23 16:36:35.573 CAT[28814:c07] -[__NSCFDictionary objectAtIndex:]: 
unrecognized selector sent to instance 0x719d0f0
2012-08-23 16:36:35.574 CAT[28814:c07] *** Terminating app due to uncaught exception 
'NSInvalidArgumentException', reason: '-[__NSCFDictionary objectAtIndex:]: 
unrecognized selector sent to instance 0x719d0f0'
*** First throw call stack:

等等。

我不知道如何到达这个数组中的一个对象。似乎 objectAtIndex 找不到任何索引,甚至索引:0,即使里面有数据。有人知道如何获取它吗? 我正在使用来自 Apple 的 PhotoScroller 模板,使用 CATiledLayer。我认为整个事情有点时髦,但每个人都说我们应该将它用于大图像。对于巨大的图像,任何人都有比 CATiledLayer 更好的解释或想法吗? (8556*7121px)。

为什么我会从 NSArray 得到 Dictionary-error? 在执行NSDictionary *dict = [__ImageData objectAtIndex:0] 时,我也遇到了同样的异常。

斯蒂安。

【问题讨论】:

  • 当心,+[NSPropertyListSerialization propertyListFromData:mutabilityOption:format:errorDescription:] 已弃用。另外,请仔细检查您的可变大小写?
  • @Hyperbole 啊,好的。我只是对苹果的Photoscroller代码进行了逆向工程,几乎没有收到警告。我现在没有警告,代码上也没有弃用的行,所以我认为一切都很好。我注意到大写,这不在代码中,这是我将代码放在这里的错误。
  • @Hyperbole 嗯,你怎么知道它已被弃用?我没有任何关于 NSPropertyListSerialization 在任何地方被弃用的线索..
  • NSPropertyListSerialization 没有被弃用,它是 propertyListFromData:mutabilityOption:format:errorDescription 被弃用的方法。
  • 啊,谢谢。我改用 propertyListWithData。

标签: objective-c ios cocoa-touch nsarray catiledlayer


【解决方案1】:

_ImageData 不是数组,而是字典。要显示字典的第一个元素,您可以执行以下操作:

NSLog(@"%@", [_ImageData objectForKey:@"Item 0"]);

【讨论】:

  • 谢谢!你是对的.. 但是它在哪里转换为 NSDictionary? Apple 的源代码使用了我提供的代码。在他们的版本中,它变成了一个数组。我可以通过类型转换来修复,还是应该转换所有内容以适应 NSDictionary?
  • _ImageDataNSDictionary,因为 Plist 中的数据已存储为字典而不是数组。 Plists 可以在其顶层存储数组和字典。您不能将NSDictionary 类型转换为NSArray,它们是完全不同的数据结构。如果您希望返回的数据是一个数组,您需要查看 Plist 文件或创建 Plist 文件的代码。要么将 Plist 文件修复为数组,要么将您的代码转换为处理 NSDictionary
  • 我查看了 Apple 的 Photoscroller 源代码,他们的示例中的 ImageData.plist 文件有一个字典数组。您的 ImageData.plist 文件似乎是一本字典。
【解决方案2】:

我在使用 JSON 数组时遇到了同样的问题。我的解决方法是将其转换为 NSDictionary,如下所示:

[(NSDictionary *)json objectForKey:@"detail"];

或者你可以这样做:

NSDictionary *dict = (NSDictionary *)array;

【讨论】:

  • 这不会转换任何东西。 json 将是任何内容,字典,数字,等等。 编译器会认为它是一个字典,因此允许你使用 NSDictionary 方法,如果它不是一个 NSDictionary* 则会崩溃。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-03-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多