2013-02-06 11 views
11

I "Datetime" zu meinem Wörterbuch hinzufügen Ich versuche wie definiert folgt:[__NSDictionaryI setObject: forKey:]: Unbekannter Selektor gesendet Instanz

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 stürzt ab und ich bekomme diese:

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) 

Antwort

31

Ihr Wörterbuch ist unveränderlich - es ist ein NSDictionary und kein NSMutableDictionary. Fix das, und es wird gut funktionieren.

7

Sie benötigen einen NSMutableDictionary zu verwenden - der Stack-Trace zeigt Ihnen eine __NSDictionaryI verwenden, (NSDictionary), die

22

ich einmal unveränderlich lief in diesen Fehler, wenn ich versehentlich eine copy Eigenschaft wie so erklärt:

@property (nonatomic,copy) NSMutableDictionary* downloadHandlers; 

wenn ich tat dies in meinem init:

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

I actu Verbündeter hat ein unveränderliches Wörterbuch. Ich hätte erwartet, dass das Aufrufen von copy auf einem veränderbaren Objekt mir auch ein veränderbares Objekt geben würde, aber anscheinend nicht. Wie auch immer, das Entfernen des Schlüsselworts copy (das ich ursprünglich nie dort sein wollte) behob das Problem.

+0

Das war genau mein Problem. Vielen Dank! –

+0

Ich stieß auf genau dasselbe Problem. Vielen Dank!! – coolcool1994

2

Da die Top-Antwort sagte, müssen Sie NSMutableDictionary anstelle von NSDictionary verwenden. Und falls Sie Literale verwenden, benutzen Sie mutableCopy wie:

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

Damit Sie wieder assign Schlüssel können

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

Vorsicht. Literale enden einfach mit [NSDictionary Alloc] initWithObjectsAndKeys, was nicht beendet wird ... –

3

Dieses Problem mit den meisten Zeit tritt auf, wenn wir mit einem Web beschäftigen Serviceantwort, da die empfangenen Daten unveränderlich sind. Wenn Sie versuchen, unveränderbare Daten zu ändern, stürzt die Anwendung definitiv ab. Ich hoffe, das folgende Code-Snippet wird helfen.

NSMutableDictionary *headerData; 

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

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

In meinem Fall hatte ich einen schnellen Code, den Wert in [AnyHashable: ANYOBJECT] liefert Format, ich musste es NSMutableDictionary konvertieren,

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

Wo, wie [[AnalyticsManager shared] addCommonPropertiesWithProperties: logDict] Dieser Teil gibt das Format [AnyHashable: AnyObject] zurück. Das hat mein Problem behoben.