SIGABRT при использовании NSDictionary setObject: forKey: - PullRequest
0 голосов
/ 23 марта 2011

Я использую файл свойств со следующей структурой:

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, и приложение падает.

Кто-нибудь видит, почему это не работает? Потому что я не ... 1015 *

Ответы [ 4 ]

4 голосов
/ 23 марта 2011

[[plist objectForKey:@"gradePercent"] copy] возвращает неизменный словарь.

Что вам нужно, это [[plist objectForKey:@"gradePercent"] mutableCopy]

4 голосов
/ 23 марта 2011

NSDictionary является неизменным, и простое приведение указателя к NSMutableDictionary * не делает объект магически изменчивым. Так что вам нужен изменчивый словарь. Вы можете сделать это так:

NSMutableDictionary *plist = [[NSMutableDictionary alloc] initWithContentsOfFile:filepath];
1 голос
/ 23 марта 2011

NSDictionary не имеет setObject: forKey: метод

1 голос
/ 23 марта 2011

Поскольку имеющийся у вас словарь предназначен только для чтения, чтобы получить изменяемый словарь из любого словаря, вам необходимо вызвать addEntriesFromDictionary в словаре Muntable

например,

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

[plist objectForKey: @"gradePercent"] является NSDictionary и поэтому не может быть добавлен в.Вы не можете просто привести из NSDictionary * к NSMutableDictionary *.

...