[__NSDictionaryI setObject:forKey:]:向实例发送未识别的选择器

19

我正在尝试将"dateTime"添加到我的字典中,如下所定义:

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)
6个回答

35
你的字典是不可变的 - 它是一个NSDictionary而不是NSMutableDictionary。修复它,它就能正常工作了。

30

我曾遇到过这个错误,当时我的 copy 属性有误:

@property (nonatomic,copy) NSMutableDictionary* downloadHandlers;

当我在我的init中这样做时:
self.downloadHandlers = [[NSMutableDictionary alloc] init];

我实际上得到了一个不可变字典。我本来以为在可变对象上调用copy方法也会返回可变对象,但显然不是这样。无论如何,移除copy关键字(我一开始并没有打算加上它)就解决了问题。


这正是我的问题。谢谢! - Reid
我遇到了完全相同的问题。谢谢! - coolcool1994

10

如排名第一的答案所述,您需要使用NSMutableDictionary而非NSDictionary。如果要使用字面量,请使用mutableCopy,例如:

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

这样,您可以使用重新分配键

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

小心... 字面值最终会使用 [NSDictionary alloc] initWithObjectsAndKeys,这是以 nil 结尾的... - Ari Braginsky

7

您需要使用一个NSMutableDictionary - 堆栈跟踪显示您正在使用一个不可变的__NSDictionaryI,(NSDictionary)。


7

当我们处理Web服务响应时,这个问题往往会发生,因为接收到的数据是不可改变的。当您尝试修改不可变数据时,应用程序肯定会崩溃。 希望以下代码片段能够帮助。

NSMutableDictionary  *headerData;

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

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

4
在我的情况下,我有一段返回值为[AnyHashable:AnyObject]格式的Swift代码,我需要将其转换为NSMutableDictionary, NSMutableDictionary *logDict = [[NSMutableDictionary alloc]initWithDictionary:[[AnalyticsManager shared]addCommonPropertiesWithProperties:logDict]]; 而[[AnalyticsManager shared]addCommonPropertiesWithProperties:logDict]这部分是以[AnyHashable:AnyObject]格式返回的。这解决了我的问题。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接