2013-02-06 15 views
11

che sto cercando di aggiungere "dateTime" a mio dizionario come definito segue:[__NSDictionaryI setObject: Forkey:]: selettore non riconosciuto inviato ad esempio

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"]; 

crash App e ottengo questo:

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) 

risposta

31

Il tuo dizionario è immutabile: è un NSDictionary e non è un NSMutableDictionary. Correggilo, e funzionerà bene.

7

Devi essere utilizzando un NSMutableDictionary - l'analisi dello stack mostra si sta utilizzando un __NSDictionaryI, (NSDictionary), che è immutabile

22

mi sono imbattuto in questo errore una volta quando ho accidentalmente dichiarato una proprietà copy in questo modo:

@property (nonatomic,copy) NSMutableDictionary* downloadHandlers; 

quando ho fatto questo nel mio init:

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

I Actu alleato ha un dizionario immutabile. Mi sarei aspettato che chiamare copy su un oggetto mutevole mi avrebbe dato anche un oggetto mutevole, ma apparentemente no. Ad ogni modo, rimuovendo la parola chiave copy (che non avevo mai intenzione di essere lì in primo luogo) ho risolto il problema.

+0

Questo era esattamente il mio problema. Grazie! –

+0

Ho riscontrato questo stesso identico problema. Grazie!! – coolcool1994

2

Come la risposta in cima alla classifica ha detto che è necessario utilizzare NSMutableDictionary anziché NSDictionary. E nel caso in cui si desidera utilizzare letterali, utilizzare mutableCopy come:

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

Così chiavi che è possibile riassegnare usando

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

I letterali attenti ... si limitano a utilizzare [allocazione NSDictionary] initWithObjectsAndKeys, che è terminato nil ... –

3

Questo problema si verifica la maggior parte del tempo in cui abbiamo a che fare con un web -servizio di servizio perché i dati ricevuti sono immutabili. Quando si tenta di modificare i dati immutabili, l'applicazione si arresterà definitivamente. Spero che il seguente frammento di codice possa essere d'aiuto.

NSMutableDictionary *headerData; 

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

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

Nel mio caso ho avuto un codice swift che restituisce il valore in [AnyHashable: ANYOBJECT] formato, ho dovuto convertirlo in NSMutableDictionary,

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

Dove, come [[AnalyticsManager condiviso] addCommonPropertiesWithProperties: logDict] questa parte ritorna nel formato [AnyHashable: AnyObject]. Questo ha risolto il mio problema.

Problemi correlati