从NSMutableArray中提取值时出现问题

时间:2012-09-02 16:23:11

标签: objective-c ios crash nsmutablearray uilabel

我正在尝试将plist文件中的数据解析为NSMutableArray。

在我的plist中 Root是一个包含6个数字的数组的字典

我创建了一个用IBOutlet UILabel * lbl4对象挂钩的标签,我希望这个标签显示读取plist的数组的第一个元素。问题是程序在分配指令(最后一个)崩溃。 我的代码是这样的:

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *docPath = [paths objectAtIndex:0];
NSString *plistPath = [docPath stringByAppendingPathComponent:@"settings.plist"];

if(![[NSFileManager defaultManager] fileExistsAtPath:plistPath]);
{
    plistPath = [[NSBundle mainBundle] pathForResource:@"settings" ofType:@"plist"];
}

NSData *plistXML = [[NSFileManager defaultManager] contentsAtPath:plistPath];
NSString *err = nil;
NSPropertyListFormat format;

NSDictionary *temp = (NSDictionary *) [NSPropertyListSerialization propertyListFromData:plistXML mutabilityOption:NSPropertyListMutableContainersAndLeaves format:&format errorDescription:&err];
if(!temp)
{
    NSLog(@"Error reading plist: %@, format: %d", err, format);
}

self.dataSet = [NSMutableArray arrayWithArray:[temp objectForKey:@"Dadi"]];
[lbl4 setText:[NSString stringWithFormat:@"%@", [dataSet objectAtIndex:0]]];

plist源代码如下:

    <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Dadi</key>
    <array/>
    <key>D4</key>
    <integer>0</integer>
    <key>D6</key>
    <integer>0</integer>
    <key>D8</key>
    <integer>0</integer>
    <key>D10</key>
    <integer>0</integer>
    <key>D12</key>
    <integer>0</integer>
    <key>D20</key>
    <integer>0</integer>
</dict>
</plist>

Debug输出显示“2012-09-02 18:29:55.483 Faith [6014:707] *由于未捕获的异常'NSRangeException'终止应用程序,原因:'* - [__ NSArrayM objectAtIndex :]:索引0超出空数组“

的边界

1 个答案:

答案 0 :(得分:1)

在你的plist中,存储在字典的Dadi键中的数组是空的!

<key>Dadi</key>
    <array/>

所以

self.dataSet = [NSMutableArray arrayWithArray:[temp objectForKey:@"Dadi"]];

将self.dataSet设置为空数组(即使索引:0超出范围)。

我会检查se.f.dataSet.count == 0并在这种情况下提供默认值。

@warrenm在评论中提到你的plist的结构不是你所期望的。这些是XML文件,因此任何以/>结尾的标记都是“自动关闭”,因此始终为空。要包含这些数字,您需要添加结束标记并将其放在内部:

<array>
  <integer>7</integer>
</array>

当然,在进一步评估时,您现有的plist具有与之关联的密钥,因此这可能也不是正确的解决方案。您需要评估您对该plist的需求。