2012-04-21 8 views
9

Ich erhalte eine Ausnahme, nachdem ich versucht habe, ein Objekt aus einem NSMutableDictionary zu entfernen. Der entsprechende Code folgt. Die 'Einstellungen' werden an die Methode übergeben und können ein NSDictionary oder ein NSMutableDictionary sein.Das Entfernen eines Objekts aus einem veränderbaren Wörterbuch löst eine Ausnahme aus

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

[mutableSettings removeObjectForKey:@"akey"]; 

Dieser stürzt mit

* Beenden app aufgrund nicht abgefangene Ausnahme 'NSInternalInconsistencyException', Grund: '- [__ NSCFDictionary removeObjectForKey:]: Verfahren mutiert zu unveränderliches Objekt gesendet'

Was ist falsch daran? Vielen Dank.

Antwort

10

Das Problem hierbei ist, dass sowohl NSDictionary und NSMutableDictionary Rückkehr __NSCFDictionary als ihre class, aufgrund der Tatsache, dass NSDictionary ein Klasse-Cluster ist.

Ich denke, Sie müssen nur eine veränderbare Kopie des settings Wörterbuchs machen, ob es veränderbar ist oder nicht.

NSMutableDictionary *mutableSettings = [settings mutableCopy]; 
+3

Wie die Unterstriche implizieren, ist '__NSCFDictionary' eine private Klasse. Es ist nicht unbedingt die einzige Wörterbuchklasse und es ist nicht garantiert, dass sie für immer da ist. Relevanter ist es eine Unterklasse von NSMutableDictionary, so dass * jedes * Dictionary (das eine Instanz von '__NSCFDictionary' ist) eine Art von NSMutableDictionary ist. All diese Dinge bedeuten, dass es keinen zuverlässigen Weg gibt zu sagen, ob ein Wörterbuch - oder irgendein anderes Plist-Objekt - veränderbar ist oder nicht. –

Verwandte Themen