7

estoy usando NSMutableDictionary y pulsa este error:"mutando método enviados a objeto inmutable" a pesar de objeto que se NSMutableDictionary

'NSInternalInconsistencyException', reason: '-[__NSCFDictionary removeObjectForKey:]: mutating method sent to immutable object' 

Aquí está el código:

// 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); 

Todos los registros de consola indican que la los datos están bien Aquí es donde las cosas comienzan a descomponerse. paso la propiedad invoiceDict al siguiente controlador de vista:

// Pass the invoice to checkoutViewController 
[checkoutViewController setInvoiceDict:self.invoiceDict]; 

En CheckoutViewController.m:

// Change invoice checkoutCompleted to true 
// [self.invoiceDict removeObjectForKey:@"checkoutCompleted"]; 
    [self.invoiceDict setObject:[NSNumber numberWithBool:YES] forKey:@"checkoutCompleted"]; 

El error es en [self.invoiceDict setObject...]. Me aseguré de que todos los diccionarios que uso sean NSMutableDictionary. Dejé algunas de las líneas comentadas en el código para mostrar las cosas que probé y choqué contra una pared de ladrillos. Supongo que siempre puedo crear un nuevo diccionario. ¿Es esa la forma preferida de hacerlo?

Respuesta

9

Está asignando un diccionario en invoiceDictFromReq y luego está creando otro diccionario, está creando una pérdida de memoria allí. Eliminar la línea

NSMutableDictionary *invoiceDictFromReq = [[NSMutableDictionary alloc] init]; 

Pero el problema es que se está creando una NSMutableDictionary pero está configurando a self.invoiceDict un diccionario dentro de su mutableDictionary, que no es necesariamente un mutableDictionary también. Cambie la línea

self.invoiceDict = [invoiceDictFromReq objectForKey:@"invoice"]; 

para

self.invoiceDict = [NSMutableDictionary dictionaryWithDictionary:[invoiceDictFromReq objectForKey:@"invoice"]]; 
+0

Gracias por la sugerencia, pero todavía me da el mismo error Ahora, tengo invoiceDictFromReq como una propiedad en .h y syntehsized en .m y lo configuré en los datos de la solicitud json como self.invoiceDictFromReq = [NSMutableDictionary dictionary ...] – okysabeni

+1

Lamento haber cambiado mi respuesta, no fue eso. Vea si todavía tiene el problema. No tiene que retener invoiceDictFromReq porque es una variable local, pero borre la línea que crea invoiceDictFromReq por primera vez porque tiene una fuga allí –

+0

:-). Cuando lo vi, "pero tu problema es que estás creando un NSMutableDictionary pero te estás configurando para autodefinir. Dictir un diccionario dentro de tu mutableDictionary, que no es necesariamente un Dictuario mutable también" Sabía que lo golpeaste en el acto. Tan necio de mi parte Gracias por mencionarlo. No debería haber supuesto que el analizador json nativo devuelve NSMutableDictionary. ¡Muchas gracias! – okysabeni

15

NSJSONSerialization devuelve objetos inmutables por defecto. Aquí es cómo conseguir diccionario mutable del analizador:

  • opción de uso NSJSONReadingMutableContainers

o

  • uso mutableCopy en el resultado
+1

Exactamente lo que estaba buscando. ¡¡¡Gracias!!! – denikov

+0

No necesita usar mutableCopy, solo use el resultado.NSJSONReadingMutableContainers no solo hace que las matrices y diccionarios dentro del resultado se puedan modificar, sino también el resultado en sí mismo. – gnasher729

Cuestiones relacionadas