在访问我的NSDictionary时需要帮助理解条件崩溃

时间:2014-01-12 20:28:51

标签: ios objective-c nsdictionary

我将数据保存在名为practiceRecords(字典NSArray的属性中。

我检查文档文件夹中是否已存在数据。

  • 如果是,我将数据加载到self.practiceRecords
  • 如果没有,我构建字典数组(使用文字语法),将这些数据保存在self.practiceRecords属性中,然后将数据写入文档文件夹。
    在写完后重新加载数据

据我所知,在此过程中没有问题。

然后我按照以下步骤修改数据......

-(void)incNumberOfTriesFor:(NSString *)stringOfIndex {

    if (self.practiceRecords)
    {
        int index = [stringOfIndex intValue];
        int numberOfTries = [(NSNumber *)(self.practiceRecords[index][@"tries"]) intValue] + 1;

        //CRASHING on this next line.
        self.practiceRecords[index][@"tries"] = @(numberOfTries);   

        //message to helper method
        [self writePracticeRecords]; 
    }
}

所以第一次通过(当数组被构建和写出时)我在指示的行发生了崩溃 错误是:

  

- [__ NSDictionaryI setObject:forKeyedSubscript:]:无法识别的选择器发送到实例

我退出应用程序,检查文档文件夹,看到写出的数据文件没有问题 我重新运行应用程序,然后没有崩溃,数据文件仍然看起来很棒 这是可重复的。

  • 如果数据文件存在,则不会崩溃。
  • 如果首先需要创建数据,那么就会崩溃。

在所有情况下,我手动查看生成的数据文件并查看我期望看到的内容 - 没有问题

我不确定在哪里开始压扁这个bug,并且真的想了解为什么会发生这种情况的详细信息。

非常感谢您的帮助!

1 个答案:

答案 0 :(得分:4)

回顾上面的正确评论:

  

- [__ NSDictionaryI setObject:forKeyedSubscript:]:无法识别的选择器发送到实例

NSDictionary没有实现任何set ...方法,因为它是不可变的。您声明在磁盘上找不到数据时使用文字语法创建。文字语法创建不可变容器

相反,试试......

// try to initialize from disk, but if not
// we can still use literal (immutable) syntax, but in a mutable container
self.practiceRecords = [NSMutableDictionary
                           dictionaryWithDictionary:@{ @"key" : @"value" }];