7

私は持っていNSMutableArrayますNSMutableArrays

 NSMutableArray *array = [[NSMutableArray alloc]init];

        for (int i = 0; i < 5; i++)
        {
            NSMutableArray *miniArray = [[NSMutableArray alloc]init];

            for (int k = 0; k < 30; k++)
            {   
                [miniArray addObject:@"0"];
            }
            [array addObject:miniArray];
        }

次に、これを実行しようとすると、次のようになります。

 [[array objectAtIndex:packIndex]replaceObjectAtIndex:index withObject:@"1"];

クラッシュします:[__NSCFArray replaceObjectAtIndex:withObject:]: mutating method sent to immutable object'

なんで ?直し方 ?ありがとう !

UPD:この配列を:に保存しNSUserDefaultsます

[defaults setObject:array forKey:@"mainArray"];

それから、私は他のクラスでそれを読みました:

array = [[NSMutableArray alloc]initWithArray:[[NSUserDefaults standardUserDefaults] objectForKey:@"mainArray"]];

また、コードが正常に実行され、「0」から「1」に変わる場合があることにも言及する必要があります。ただし、クラッシュすることもあります。だから私はロジック、なぜそれがうまくいくのか、なぜそれが時々クラッシュするのかを見ることができません。

4

3 に答える 3

26

問題は、NSUserDefaultsから配列を読み取るときに、ミニ配列が自動的にNSMutableArraysにならないことです。

これを試して:

array = [[NSMutableArray alloc]initWithArray:[[NSUserDefaults standardUserDefaults] objectForKey:@"mainArray"]];
for(int i = 0; i < array.count; i++) {
    NSArray * tempArray = array[i];
    array[i] = [tempArray mutableCopy];
}

編集:ベストコーダーの答えは、これがなぜであるかを説明しています。NSUserDefaultsに格納されているオブジェクトは、不変バージョンとして格納されます。基本的に、NSUserDefaultsはplistであり、配列を可変/不変としてマークするフラグがないため、オブジェクトを読み戻すと、不変であると見なされます。

于 2013-02-12T20:09:45.763 に答える
6

NSUserDefaultsから返される値は、可変オブジェクトを値として設定した場合でも不変です。たとえば、「MyStringDefault」の値として可変文字列を設定した場合、後でstringForKey:を使用して取得する文字列は不変になります。

代わりに、NSUserDefaultsから取得した配列のmutableCopyを作成し、オブジェクトを追加してから、新しい配列をに戻します。

次のリンクを参照してください:http: //developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSUserDefaults_Class/Reference/Reference.html

于 2013-02-12T20:11:31.720 に答える
-5

より詳細なコードを使用してみてください。

NSMutableArray *tempArray = [array objectAtIndex:packIndex];
[tempArray replaceObjectAtIndex:index withObject:@"1"];
于 2013-02-12T19:57:33.243 に答える