Ответ 1
Ваш словарь неизменен - это NSDictionary
, а не NSMutableDictionary
. Исправьте это, и все будет хорошо.
Я пытаюсь добавить "dateTime" в My dictionary, как определено ниже:
Symptom Ranking: {
5111ef19253b4a9150000000 = 1;
5111f029253b4add4e000000 = 1;
5111f036253b4a123d000001 = 1;
5111f045253b4a404f000000 = 1;
}
NSLog(@"date selected: %@", [[self.datePicker date] description])
[self.results setObject:[[self.datePicker date] description] forKey:@"dateTime"];
Сбой приложения, и я получаю следующее:
Symptom Tracker[43134:c07] -[__NSDictionaryI setObject:forKey:]: unrecognized selector sent to instance 0x7603990
2013-02-06 08:15:58.741 Symptom Tracker[43134:c07] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSDictionaryI setObject:forKey:]: unrecognized selector sent to instance 0x7603990'
*** First throw call stack:
(0x171b012 0x1428e7e 0x17a64bd 0x170abbc 0x170a94e 0x521e 0x143c705 0x373920 0x3738b8 0x434671 0x434bcf 0x433d38 0x3a333f 0x3a3552 0x3813aa 0x372cf8 0x2652df9 0x2652ad0 0x1690bf5 0x1690962 0x16c1bb6 0x16c0f44 0x16c0e1b 0x26517e3 0x2651668 0x37065c 0x25dd 0x2505)
Ваш словарь неизменен - это NSDictionary
, а не NSMutableDictionary
. Исправьте это, и все будет хорошо.
Я столкнулся с этой ошибкой один раз, когда я случайно объявил свойство copy
следующим образом:
@property (nonatomic,copy) NSMutableDictionary* downloadHandlers;
когда я сделал это в своем init
:
self.downloadHandlers = [[NSMutableDictionary alloc] init];
На самом деле я получил неизменный словарь. Я ожидал, что вызов copy
в изменяемом объекте также даст мне изменчивый объект, но, видимо, нет. Во всяком случае, удаление ключевого слова copy
(которое я никогда не предполагал там в первую очередь) устранил проблему.
Вам нужно использовать NSMutableDictionary
- трассировка стека показывает, что вы используете __NSDictionaryI
, (NSDictionary
), который является неизменным
Эта проблема возникает большую часть времени, когда мы имеем дело с ответом веб-службы, потому что полученные данные неизменяемы. Когда вы пытаетесь изменить неизменяемые данные, приложение обязательно сработает. Я надеюсь, что следующий фрагмент кода поможет.
NSMutableDictionary *headerData;
/*Every time you need to allocate memory to the corresponding MutableDictionary variable*/
headerData =[[NSMutableDictionary alloc ]initWithDictionary:response[@"Header"]];
В моем случае у меня был быстрый код, который возвращает значение в формате [AnyHashable: AnyObject], мне пришлось преобразовать его в NSMutableDictionary,
NSMutableDictionary *logDict = [[NSMutableDictionary alloc]initWithDictionary:[[AnalyticsManager shared]addCommonPropertiesWithProperties:logDict]];
В качестве [[AnalyticsManager shared] addCommonPropertiesWithProperties: logDict] эта часть возвращается в формате [AnyHashable: AnyObject]. Это исправило мою проблему.
Как сказал топ-рейтинг, вам нужно использовать NSMutableDictionary
вместо NSDictionary
. И если вы хотите использовать литералы, используйте mutableCopy
как:
NSMutableDictionary* dict = [@{@"key": @"value"} mutableCopy];
Чтобы вы могли повторно назначать клавиши, используя
dict[@"key"] = @"new-value";