2010-12-01 9 views
0

私はObjective-Cの領域に飛び込みはじめ、ゆっくりとすべてを取得しています。私は、NSMutableArrayであったファイルをアーカイブ解除し、その配列で私のモデルを初期化しています。配列は、さまざまなNSMutableDicationaryでいっぱいです。私が見たことから、これらの辞書は変更不可能なものとして追加されるので、私は先に進み、レギュラーをコピーして変更可能なものに入れ、古いものを削除します。このソリューションは、最初のインスタンスを除くすべてのインスタンスで動作するようです。NCSFDictionary、不変オブジェクトに送信された突然変異メソッド

私はなぜそれが最初のもの以外のすべてのためにうまくいくのかについて迷っています。ここで

は、私はここですべての

-(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; 
} 

を初期化していますどのようにエラーを投げているコードで、値がテーブルビューのチェックボックスをオフに読んで値を変更するためにここに渡されています。ここで

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

は、私が試してみて、最初の要素にあなたの助けを

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

感謝を変更したときに、それが示すことエラーです。より良い方法があれば教えてください。

答えて

3

このループのコードが間違っている:あなたがオブジェクトを削除すると

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

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

、配列が付け直されます。最初のオブジェクトをインデックス0で処理した後、最初の2番目のオブジェクトはインデックス0の最初のオブジェクトになりますが、iはインデックス1に設定されます。これは元の3番目のオブジェクトです!つまり、元の配列から代替アイテムだけを処理していて、2番目、4番目などのアイテムが交換されることはありません。そのため、表示されているエラーが発生します。

これを解決する1つの方法は、objectAtIndex:の "i"と "0"の呼び出しをremoveObjectAtIndex:と置き換えることです。そのため、常にアイテムを配列の前面から取り除いています。

別の解決策は、別のnewServerListアレイを作成し、その中に新しいオブジェクトを挿入することです。ループの最後に、古いserverListを解放し、newServerListを指すように変数を設定します。

+0

うわー、ありがとう!それは今、魅力のように動作します。 – utahwithak

+0

ありがとうございます...あまりにも解決されたmaの問題.. :) – Rajneesh071

+0

と私も答えて..あなたの答えを使用して.. :) http:// stackoverflow。com/questions/6100271/nsinternalinconsistencyexception-with-nsuserdefaults-use-method-setvalue/13952939#13952939 – Rajneesh071

1

インデックスが乱雑です。すぐにインデックス0でオブジェクトを削除するよう、次のものは、それは場所ですがかかりますし、あなたは、インデックス1

{immutable0, immutable1} 

i = 0: 

addObject: 
{immutable0, immutable1, mutable0} 

removeObjectAtIndex: 
{immutable1, mutable0} 

i = 1: 

addObject: 
{immutable0, mutable0, mutable02} 

removeObjectAtIndex: 
{immutable0, mutable02} 

を続けていくので、あなたは、それを置き換えることはありません - >まだそこに不変です。同時にループしている可変配列からオブジェクトを削除しないでください。

あなたは、コードを少し凝縮できます

NSMutableArray *serverList = [NSMutableArray arrayWithCapacity:[savedList count]]; 
for (NSDictionary *dictionary in savedList) 
{ 
    mutable = [dictionary mutableCopy]; 
    [serverList addObject:mutable]; 
    [mutable release]; 
} 
あなたの問題とは無関係の

:あなたはそこに不変の配列を期待する場合、引数は、(NSMutableArray)は明らかに間違っています。そのようにserverListを作成すると、ディープコピー(copyItems:YES)の必要はありません。

関連する問題