使用NSDictionary时的SIGABRT setObject:forKey:

时间:2011-03-23 10:49:57

标签: iphone objective-c plist nsdictionary

我正在使用具有此结构的属性文件:

maxRating     Number    --> 5
gradePercent  Dictonary
>grade1       Number    --> 0.85
>grade2       Number    --> 0.70
>grade3       Number    --> 0.55
>grade4       Number    --> 0.40

阅读我正在使用的属性

NSDictionary *plist = [[NSDictionary alloc] initWithContentsOfFile:filepath];

rating = [[plist objectForKey:@"maxRating"] intValue];
gradePercent = (NSMutableDictionary*)[[plist objectForKey:@"gradePercent"] copy];

直到这里,每件事情都完美无缺......我可以使用[gradePercent objectForKey:@"grade1"]

获得正确的对象

但是当我尝试用

设置其中一个时
[gradePercent setObject:[NSNumber numberWithFloat:0.90] forKey:@"grade1"]

我总是收到SIGABRT错误而且APP崩溃了。

有谁知道为什么这不起作用?因为我没有-.-

4 个答案:

答案 0 :(得分:4)

NSDictionary是不可变的,只是将指针强制转换为NSMutableDictionary *不会使对象神奇地变得可变。所以你需要一个可变的字典。你可以这样做:

NSMutableDictionary *plist = [[NSMutableDictionary alloc] initWithContentsOfFile:filepath];

答案 1 :(得分:4)

[[plist objectForKey:@"gradePercent"] copy]返回一个不可变的字典。

您需要的是[[plist objectForKey:@"gradePercent"] mutableCopy]

答案 2 :(得分:1)

因为您拥有的词典只是从任何字典中获取Mutable字典,您需要在Muntable字典上调用addEntriesFromDictionary

e.g。

NSMutableDictionary* dict = [NSMutableDictionary dictionary];
[dict addEntriesFromDictionary:[plist objectForKey:@"gradePercent"]];

[plist objectForKey:@“gradePercent”]是一个NSDictionary,因此无法添加到。您不能简单地从NSDictionary *转换为NSMutableDictionary *。

答案 3 :(得分:1)

NSDictionary没有setObject:forKey:方法