18

次のように定義されているように、「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)
4

6 に答える 6

35

あなたの辞書は不変です - それは でNSDictionaryあり、 ではありませんNSMutableDictionary。それを修正すると、うまくいきます。

于 2013-02-06T14:25:12.660 に答える
28

copy次のように誤ってプロパティを宣言したときに、このエラーに遭遇しました。

@property (nonatomic,copy) NSMutableDictionary* downloadHandlers;

私が私の中でこれをしたときinit

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

私は実際に不変の辞書を手に入れました。可変オブジェクトを呼び出すcopyと、可変オブジェクトも得られると思っていましたが、明らかにそうではありません。とにかく、copyキーワードを削除すると(そもそもそこにいるつもりはありませんでした)、問題が修正されました。

于 2014-08-12T21:38:57.670 に答える
9

NSMutableDictionaryトップランクの回答が言ったように、の代わりに使用する必要がありますNSDictionary。リテラルを使用する場合は、次のmutableCopyように使用します。

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

を使用してキーを再割り当てできるように

dict[@"key"] = @"new-value";
于 2014-09-05T07:53:09.090 に答える
7

この問題は、ほとんどの場合、Web サービスの応答を処理しているときに発生します。これは、受信したデータが不変であるためです。不変データを変更しようとすると、アプリケーションは間違いなくクラッシュします。次のコード スニペットがお役に立てば幸いです。

NSMutableDictionary  *headerData;

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

headerData =[[NSMutableDictionary alloc ]initWithDictionary:response[@"Header"]];
于 2017-04-15T13:13:50.313 に答える
7

を使用する必要がありますNSMutableDictionary-スタックトレースは、不変の__NSDictionaryI,( ) を使用していることを示していますNSDictionary

于 2013-02-06T14:25:29.893 に答える
4

私の場合、[AnyHashable:AnyObject] 形式で値を返す迅速なコードがあり、それを NSMutableDictionary に変換する必要がありました。

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

[[AnalyticsManager shared]addCommonPropertiesWithProperties:logDict] の場合、この部分は [AnyHashable:AnyObject] 形式で返されます。それは私の問題を修正しました。

于 2017-12-15T07:21:00.300 に答える