[__NSDictionaryI setObject: forKey:]: непризнанный селектор, отправленный в экземпляр

Я пытаюсь добавить "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)

Ответ 1

Ваш словарь неизменен - ​​это NSDictionary, а не NSMutableDictionary. Исправьте это, и все будет хорошо.

Ответ 2

Я столкнулся с этой ошибкой один раз, когда я случайно объявил свойство copy следующим образом:

@property (nonatomic,copy) NSMutableDictionary* downloadHandlers;

когда я сделал это в своем init:

self.downloadHandlers = [[NSMutableDictionary alloc] init];

На самом деле я получил неизменный словарь. Я ожидал, что вызов copy в изменяемом объекте также даст мне изменчивый объект, но, видимо, нет. Во всяком случае, удаление ключевого слова copy (которое я никогда не предполагал там в первую очередь) устранил проблему.

Ответ 3

Вам нужно использовать NSMutableDictionary - трассировка стека показывает, что вы используете __NSDictionaryI, (NSDictionary), который является неизменным

Ответ 4

Эта проблема возникает большую часть времени, когда мы имеем дело с ответом веб-службы, потому что полученные данные неизменяемы. Когда вы пытаетесь изменить неизменяемые данные, приложение обязательно сработает. Я надеюсь, что следующий фрагмент кода поможет.

NSMutableDictionary  *headerData;

/*Every time you need to allocate memory to the corresponding MutableDictionary variable*/

headerData =[[NSMutableDictionary alloc ]initWithDictionary:response[@"Header"]];

Ответ 5

В моем случае у меня был быстрый код, который возвращает значение в формате [AnyHashable: AnyObject], мне пришлось преобразовать его в NSMutableDictionary,

NSMutableDictionary *logDict = [[NSMutableDictionary alloc]initWithDictionary:[[AnalyticsManager shared]addCommonPropertiesWithProperties:logDict]];

В качестве [[AnalyticsManager shared] addCommonPropertiesWithProperties: logDict] эта часть возвращается в формате [AnyHashable: AnyObject]. Это исправило мою проблему.

Ответ 6

Как сказал топ-рейтинг, вам нужно использовать NSMutableDictionary вместо NSDictionary. И если вы хотите использовать литералы, используйте mutableCopy как:

NSMutableDictionary* dict = [@{@"key": @"value"} mutableCopy];

Чтобы вы могли повторно назначать клавиши, используя

dict[@"key"] = @"new-value";