2010-12-01 5 views
0

Ich habe gerade angefangen, in das Reich von Objective-C zu springen und bekomme langsam alles. Ich habe an dem Archivieren einer Datei gearbeitet, die ein NSMutableArray war und dann in meinem Modell mit diesem Array initialisiert. Das Array ist mit verschiedenen NSMutableDicationary's gefüllt. Nach dem, was ich gesehen habe, wird es diese Wörterbücher als nicht änderbar hinzufügen, also ging ich voran und kopierte das reguläre und legte sie in ein veränderbares und entferne das alte. Diese Lösung scheint für alle Instanzen außer dem allerersten zu funktionieren.NCSFDictionary, Muting-Methode an unveränderliches Objekt gesendet

Ich bin ratlos, warum es für alle außer dem ersten funktionieren würde.

Hier ist, wie ich das alles

-(id) initWithList:(NSMutableArray *)savedList 
{ 
    self = [super init]; 
    if (self) 
    { 
     int size=0; 
     serverList=[[NSMutableArray alloc] initWithArray:savedList copyItems:YES]; 
     size=[serverList count]; 
     for(int i=0;i<size;i++) 
     { 
      loginList=[NSMutableDictionary dictionaryWithDictionary:[serverList objectAtIndex:i]]; 
      [serverList addObject:loginList]; 
      [serverList removeObjectAtIndex:i]; 
     } 
    } 
    return self; 
} 

Hier ist der Code bin initialisiert, der den Fehler zu werfen, Der Wert wird in einem Tableview aus einer Checkbox lesen und hier übergeben den Wert zu ändern. Hier

-(void)setMount:(int)row value:(NSNumber*)boolAsNumber 
{ 
    [[serverList objectAtIndex:row] setObject:boolAsNumber forKey:@"mountshare"]; 
} 

ist der Fehler, dass es zeigt, wenn ich versuche, und ändern Sie das erste Element

2010-12-01 13:38:54.445 Network Share[35992:a0f] *** -[NSCFDictionary setObject:forKey:]: mutating method sent to immutable object 

Vielen Dank für Ihre Hilfe. Wenn es einen besseren Weg gibt, lass es mich wissen.

Antwort

3

Diese Schleife Code ist falsch:

size=[serverList count]; 
    for(int i=0;i<size;i++) 
    { 

     loginList=[NSMutableDictionary dictionaryWithDictionary:[serverList objectAtIndex:i]]; 
     [serverList addObject:loginList]; 
     [serverList removeObjectAtIndex:i]; 
    } 

Wenn Sie ein Objekt entfernen, wird das Array neu nummeriert wird. Nachdem Sie das erste Objekt mit dem Index 0 bearbeitet haben, wird das ursprüngliche zweite Objekt das erste Objekt mit dem Index 0, aber i wird jetzt auf den Index 1 gesetzt, wo sich das ursprüngliche dritte Objekt befindet! Dies bedeutet, dass Sie nur alternative Elemente aus dem ursprünglichen Array verarbeiten und die 2., 4. usw. Elemente niemals vertauscht werden, und deshalb erhalten Sie die Fehler, die Sie sehen.

Eine Möglichkeit, dies zu lösen, wäre, das "i" in den Aufrufen objectAtIndex: und removeObjectAtIndex: durch "0" zu ersetzen, so dass Sie immer Elemente von der Vorderseite des Arrays nehmen.

Die alternative Lösung wäre, ein separates newServerList Array zu erstellen und Ihre neuen Objekte in das Array einzufügen. Lassen Sie am Ende der Schleife die alte serverList frei und setzen Sie die Variable so, dass sie auf newServerList zeigt.

+0

Wow danke! Das erklärt es, wirkt jetzt wie ein Zauber. – utahwithak

+0

danke ... +1 seine gelöst ma Problem auch .. :) – Rajneesh071

+0

und ich antwortete auch .. mit Ihrer Antwort .. :) http: // stackoverflow.com/questions/6100271/nsinternalinconsistencyexception-with-nsuserdefaults-wenn-using-method-setvalue/13952939 # 13952939 – Rajneesh071

1

Ihre Indizes sind durcheinander. Sobald Sie das Objekt bei Index 0, der nächste findet entfernen Platz es ist, und Sie werden nie ersetzen, weil man dann mit dem Index weitermachen 1.

{immutable0, immutable1} 

i = 0: 

addObject: 
{immutable0, immutable1, mutable0} 

removeObjectAtIndex: 
{immutable1, mutable0} 

i = 1: 

addObject: 
{immutable0, mutable0, mutable02} 

removeObjectAtIndex: 
{immutable0, mutable02} 

- noch> dort die unveränderliche bekam. Denken Sie daran, niemals Objekte aus einem veränderbaren Array zu entfernen, durch das Sie gleichzeitig durchschleifen.

Sie den Code ein wenig kondensieren könnte:

NSMutableArray *serverList = [NSMutableArray arrayWithCapacity:[savedList count]]; 
for (NSDictionary *dictionary in savedList) 
{ 
    mutable = [dictionary mutableCopy]; 
    [serverList addObject:mutable]; 
    [mutable release]; 
} 

Unrelated für Ihr Problem: Das Argument ist offensichtlich falsch (NSMutableArray), wenn Sie eine unveränderliche Array dort erwarten; Wenn Sie Ihre Serverliste auf diese Weise erstellen, ist keine tiefe Kopie erforderlich (copyItems: YES).

Verwandte Themen