"Mutating-Methode gesendet immutable object" trotz Objekt NSMutableDictionary
Ich bin mit NSMutableDictionary
ein und drücken Sie diese Fehler:
'NSInternalInconsistencyException', reason: '-[__NSCFDictionary removeObjectForKey:]: mutating method sent to immutable object'
Hier der code:
//Turn the JSON strings/data into objects
NSError *error;
NSMutableDictionary *invoiceDictFromReq = [[NSMutableDictionary alloc] init];
// invoiceDictFromReq = (NSMutableDictionary *)[NSJSONSerialization JSONObjectWithData:[request responseData] options:kNilOptions error:&error];
invoiceDictFromReq = [NSMutableDictionary dictionaryWithDictionary:[NSJSONSerialization JSONObjectWithData:[request responseData] options:kNilOptions error:&error]];
NSLog(@"invoiceDictFromReq count: %i, key: %@, value: %@", [invoiceDictFromReq count], [invoiceDictFromReq allKeys], [invoiceDictFromReq allValues]);
//Get values and keys from JSON response
self.invoiceDict = [invoiceDictFromReq objectForKey:@"invoice"];
NSNumber *invoiceAmount = [self.invoiceDict objectForKey:@"amount"];
NSNumber *invoiceId = [self.invoiceDict objectForKey:@"id"];
NSNumber *invoiceNumber = [self.invoiceDict objectForKey:@"number"];
NSNumber *checkoutStarted = [self.invoiceDict objectForKey:@"checkoutStarted"];
NSNumber *checkoutCompleted = [self.invoiceDict objectForKey:@"checkoutCompleted"];
NSLog(@"amount: %@, id: %@, number: %@, started: %@, completed: %@", invoiceAmount, invoiceId, invoiceNumber, checkoutStarted, checkoutCompleted);
Den Konsolen-logs anzuzeigen, dass die Daten in Ordnung ist. Dies ist, wo Dinge beginnen zu brechen nach unten.
Ich pass die invoiceDict
- Eigenschaft, um die nächste view-controller:
//Pass the invoice to checkoutViewController
[checkoutViewController setInvoiceDict:self.invoiceDict];
In CheckoutViewController.m:
//Change invoice checkoutCompleted to true
// [self.invoiceDict removeObjectForKey:@"checkoutCompleted"];
[self.invoiceDict setObject:[NSNumber numberWithBool:YES] forKey:@"checkoutCompleted"];
Der Fehler ist bei [self.invoiceDict setObject...]
. Ich stellte sicher, dass alle Wörterbücher die ich verwende sind NSMutableDictionary
. Ich habe manche von den auskommentierten Zeilen in den code zu zeigen, die Dinge, die ich habe versucht, und ich traf eine Mauer. Ich glaube, ich kann immer einen neuen Wörterbuch. Ist, dass der bevorzugte Weg, es zu tun?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sind Sie allocing ein Wörterbuch in invoiceDictFromReq und Sie werden als Nächstes erstellen Sie ein anderes Wörterbuch, das Sie erstellen ein Leck in den Speicher gibt.
Löschen Sie die Zeile
Aber dein problem ist, dass Sie die Schaffung eines NSMutableDictionary aber Sie sind Einstellung zu sich selbst.invoiceDict ein Wörterbuch in Ihrem mutableDictionary, das ist nicht unbedingt ein mutableDictionary zu.
Ändern Sie die Zeile
für
NSJSONSerialization
gibt unveränderliche Objekte standardmäßig. Hier ist, wie man veränderliche Wörterbuch vom parser:NSJSONReadingMutableContainers
oder
mutableCopy
auf das Ergebnis