2012-04-21 17 views
9

Recibo una excepción después de intentar eliminar un objeto de un NSMutableDictionary. El código relevante sigue. La 'configuración' se pasa al método y puede ser un NSDictionary o un NSMutableDictionary.Eliminar un objeto de un diccionario mutable arroja una excepción

NSMutableDictionary *mutableSettings = nil; 
if ([settings isKindOfClass:[NSMutableDictionary class]]) 
    mutableSettings = (NSMutableDictionary *)settings; 
else 
    mutableSettings = [[[NSMutableDictionary alloc] initWithDictionary:settings] autorelease]; 

[mutableSettings removeObjectForKey:@"akey"]; 

Esto bloquea con

* Terminación de aplicación debido a excepción no detectada 'NSInternalInconsistencyException', razón: '- [__ NSCFDictionary removeObjectForKey:]: Método mutando enviado al objeto inmutable'

¿Qué pasa con esto? Gracias.

Respuesta

10

El problema aquí es que tanto NSDictionary y NSMutableDictionary retorno __NSCFDictionary como su class, debido al hecho de que NSDictionary es un grupo clase.

Creo que solo tendrá que hacer una copia mutable del diccionario settings ya sea mutable o no.

NSMutableDictionary *mutableSettings = [settings mutableCopy]; 
+3

Además, como los guiones bajos implican, '__NSCFDictionary' es una clase privada. No es necesariamente la única clase de diccionario, y no se garantiza que permanezca por siempre. Más relevante, es una subclase de NSMutableDictionary, por lo que * cada * diccionario (que es una instancia de '__NSCFDictionary') es una especie de NSMutableDictionary. Todas estas cosas significan que no hay una forma confiable de decir si un diccionario o cualquier otro objeto plist es mutable o no. –

Cuestiones relacionadas