1

NSUserDefault からの多次元配列の格納とアクセスに少し問題があります。どんな助けでも大歓迎です。このコードを実行すると発生するエラーは、「*キャッチされない例外 'NSInternalInconsistencyException' が原因でアプリを終了しています。理由: '-[__NSCFArray insertObject:atIndex:]: mutating method sent to immutable object'」です。

//To create, add values to and store arrays
multiArray = [[NSArray alloc] init];
multiArray = [NSArray arrayWithObjects:[NSMutableArray array], [NSMutableArray array], [NSMutableArray array], nil];

[[multiArray objectAtIndex:0] addObject:[NSNumber numberWithDouble:number1]];
[[multiArray objectAtIndex:1] addObject:[NSNumber numberWithDouble:number2]];
[[multiArray objectAtIndex:2] addObject:[NSNumber numberWithDouble:number3]];
NSUserDefaults * standardUserDefaults = [NSUserDefaults standardUserDefaults]
[standardUserDefaults setObject:multiArray forKey:@"multiArray"];
[standardUserDefaults synchronize];

//To access the array
NSArray *multiArrayCopy = [[NSArray alloc] init];
multiArrayCopy = [[standardUserDefaults objectForKey:@"multiArray"] mutableCopy];
NSLog(@"array count is %i", [[multiArrayCopy objectAtIndex:2] count]);
Label1.text = [NSString stringWithFormat:@"%@", [[multiArrayCopy objectAtIndex:0] objectAtIndex:0]];
Label2.text = [NSString stringWithFormat:@"%@", [[multiArrayCopy objectAtIndex:1] objectAtIndex:0]];
Label3.text = [NSString stringWithFormat:@"%@", [[multiArrayCopy objectAtIndex:2] objectAtIndex:0]];
4

1 に答える 1

0

[NSMutableArray array] は空の (可変でない) 配列を返す NSArray のクラス メソッドであるため、エラーが発生しています。NSMutableArray は NSArray のサブクラスであることを思い出してください。したがって、NSMutableArray リストを作成してみてください。

NSMutableArray *mutableArray0 = [[NSMutableArray alloc] init];
NSMutableArray *mutableArray1 = [[NSMutableArray alloc] init];
NSMutableArray *mutableArray2 = [[NSMutableArray alloc] init];

multiArray = [[NSMutableArray alloc] init];
multiArray = [NSMutableArray arrayWithObjects:mutableArray0, mutableArray1, mutableArray2, nil];

また、multiArray も NSMutableArray であるべきだと思います。これを試して、エラーが消えるかどうかを確認してください。

うまくいかない場合は、ロジックを最も単純な要素に分解してみてください。オブジェクトを使用して 1 次元配列を保存して戻すことはできますか? つまり、次のようにするとどうなるでしょうか。

NSMutableArray *mutableArray0 = [[NSMutableArray alloc] init];
[mutableArray0 addObject:[NSNumber numberWithInt:myNumber]];
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
[defaults setObject:mutableArray0 forKey:@"myMutableArray"];
[[NSUserDefaults standardUserDefaults] synchronize];    

それが機能するようになったら、別の可変配列にネストしてみてください。

NSMutableArray *mutableArray0 = [[NSMutableArray alloc] init];
[mutableArray0 addObject:[NSNumber numberWithInt:myNumber]];

NSMutableArray *multiArray = [[NSMutableArray alloc] init];
[multiArray addObject:mutableArray0]; 
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
[defaults setObject:multiArray forKey:@"myMutableArray"];
[[NSUserDefaults standardUserDefaults] synchronize];    

これはうまくいくはずです。

于 2012-05-22T19:36:46.447 に答える