[__NSDictionaryI setObject:forKey:]:发送到实例的无法识别的选择器

时间:2013-02-06 14:22:42

标签: ios nsdictionary nsmutabledictionary foundation

我正在尝试将“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"];

App崩溃了,我明白了:

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 个答案:

答案 0 :(得分:31)

您的词典是不可变的 - 它是NSDictionary而不是NSMutableDictionary。解决这个问题,它会正常工作。

答案 1 :(得分:25)

当我不小心宣布copy属性时,我遇到了这个错误:

@property (nonatomic,copy) NSMutableDictionary* downloadHandlers;

当我在init中执行此操作时:

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

我实际上有一本不可变的字典。我原以为在可变对象上调用copy也会给我一个可变对象,但显然不是。无论如何,删除copy关键字(我从来没有打算在那里)解决了问题。

答案 2 :(得分:7)

您需要使用NSMutableDictionary - 堆栈跟踪显示您使用的是__NSDictionaryI,(NSDictionary),这是不可变的

答案 3 :(得分:7)

排名靠前的答案表示您需要使用NSMutableDictionary代替NSDictionary。如果您想使用文字,请使用mutableCopy,如:

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

这样您就可以使用

重新分配密钥了
dict[@"key"] = @"new-value";

答案 4 :(得分:5)

当我们处理Web服务响应时,大多数情况下都会出现此问题,因为收到的数据是不可变的。当您尝试更改不可变数据时,应用程序肯定会崩溃。 我希望以下代码片段能够提供帮助。

NSMutableDictionary  *headerData;

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

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

答案 5 :(得分:4)

在我的情况下,我有一个快速的代码,以[AnyHashable:AnyObject]格式返回值,我不得不将其转换为NSMutableDictionary,

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

[[AnalyticsManager共享] addCommonPropertiesWithProperties:logDict]此部分以[AnyHashable:AnyObject]格式返回。这解决了我的问题。