objective-c - 从 NSDictionary 读取到 NSMutableArray 当只有一个元素时崩溃

标签 objective-c ios cocoa-touch nsarray nsdictionary

我有一个 NSDictionary,我从 xml 文件中获取数据。

xml 文件如下所示:

<?xml version="1.0" encoding="ISO-8859-1" standalone="no"?>
<root>
<customer>
    <areas>
        <area>
            <company>ABC</company>
            <state>OO</state>
            <area_name>Somename</area_name>
            <count>123</count>
            <total_custs>123123</total_custs>
        </area>
       <area>
            <company>BCD</company>
            <state>EE</state>
            <area_name>Somename2</area_name>
            <count>1233</count>
            <total_custs>11233</total_custs>
        </area>
    </areas>
</customer>
</root>

我将这个 xml 读入 NSDictionary ,说 myDict ,然后我想将它存储在 NSMutableArray 中,说 myArray ,我使用:

myArray = [[NSMutableArray alloc] initWithArray:[[[[myDict objectForKey:@"root"] objectForKey:@""customer"] objectForKey:@"areas"] objectForKey:@"area"]] autorelease];

如果我有零个,或两个或更多,这就很好用了<area> , 但如果我只有一个,它就会崩溃,就像我上面展示的那样。

以下是一些我认为可能有用的信息,

2011-08-12 09:04:40.343 TEST[28595:ef03] -[__NSCFDictionary getObjects:range:]: unrecognized selector sent to instance 0x588af50
2011-08-12 09:04:40.345 TEST[28595:ef03] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFDictionary getObjects:range:]: unrecognized selector sent to instance 0x588af50'

部分调用栈:

0   CoreFoundation                      0x011fc5a9 __exceptionPreprocess + 185
1   libobjc.A.dylib                     0x01350313 objc_exception_throw + 44
2   CoreFoundation                      0x011fe0bb -[NSObject(NSObject) doesNotRecognizeSelector:] + 187
3   CoreFoundation                      0x0116d966 ___forwarding___ + 966
4   CoreFoundation                      0x0116d522 _CF_forwarding_prep_0 + 50
5   CoreFoundation                      0x011f7fc5 -[NSArray initWithArray:range:copyItems:] + 245
6   CoreFoundation                      0x0115fdc0 -[NSArray initWithArray:] + 96

编辑:

我想我可能知道发生了什么,所以我添加了一个 if-else 语句:

if ([[[[[myDict objectForKey:@"root"] objectForKey:@""customer"] objectForKey:@"areas"] objectForKey:@"area"] isKindOfClass:[NSArray class]]) {
    ALog(@"is array!");
}
else
{
    ALog(@"not array!");
}

当只有一个元素时,它给我“没有数组”,但我仍在使用 initWithArray创建我的 NSMutableArray。

所以我可以使用 isKindOfClass 检查对象是否是类型, 有没有办法让它只告诉我它是什么类型的对象?

最佳答案

你没有说你是如何将 XML 翻译成字典的,但是从你的 XML 的结构和错误来看,area 似乎是一个字典,而不是一个数组,所以你不能将它用作 initWithArray: 的参数。据推测,当有许多 area 元素时,从 XML 到对象的映射会将其转换为字典数组,而当只有一个元素时则不会。

关于objective-c - 从 NSDictionary 读取到 NSMutableArray 当只有一个元素时崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7043016/

相关文章:

iOS 代码适用于 iOS 9 但不适用于 iOS 8?

ios - 获取不在文档目录中的 PDF 的 URL - UIDocumentInteractionController

objective-c - Key value observing中的context参数是做什么用的

objective-c - Mac : NSWindowController, View 关闭后打不开

ios - 无法将 UITabBarController 与滑动侧边菜单一起使用

ios - 将 utc 日期转换为 12 小时本地日期?

iphone - resignFirstResponder 不会关闭键盘

objective-c - 'attach' 一个按钮如何连接到另一个进程的窗口?

objective-c - cocoa 获取已安装应用程序列表

objective-c - 不断填充一个tableview