1

У меня есть немного проблем с хранением и доступом к многомерному массиву из NSUserDefault. Любая помощь будет оценена по достоинству. Я получаю ошибку, когда я запускаю этот код является «* Нагрузочного приложение из-за неперехваченное исключение„NSInternalInconsistencyException“, причина:„- [__ NSCFArray insertObject: atIndex]: мутирует метод направлен непреложный объекта“»Настройка/Доступ к многомерному массиву из NSUserDefaults

//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]]; 
+3

и «не работает» означает что? И просто чтобы вы знали, что ваш код работает для меня. –

+0

Я должен был быть более конкретным, фактическая ошибка, которую я получаю, была включена в вопрос. – SNV7

+0

, и вы уверены, что это сбой этого кода? Как сказал, я действительно запускал этот код, и он работал. Думаю, это в той части, которую вы опустили. Часть кода, которая пытается мутировать массив, который вы получили от NSUserDefaults. –

ответ

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, а также. Попробуйте это, чтобы увидеть, исчезла ли ошибка.

Если это не помогает, попробуйте разбить логику на простейшие элементы. Можете ли вы сохранить и вернуть одномерный массив с вашими объектами? То есть, что произойдет, если вы выполните следующее?

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];  

Это должно работать.

+0

Привет, спасибо за ответ. Я добавил то, что вы предложили, но ошибка остается. В приведенном выше коде, который я изначально опубликовал, когда я комментирую «[standardUserDefaults setObject: multiArray forKey: @« multiArray »]; программа не сбой (хотя NSUserDefault не работает), я думаю, что это имеет какое-то отношение к добавлению NSArray из MSMutableArrays в NSUserDefaults, а программа запутывается ?? – SNV7

+0

На самом деле, теперь, когда я думаю об этом, я не думаю, что вы можете сохранить NSArray в NSUserDefaults. Это должен быть NSMutableArray. – Sunny

+0

Я отредактировал свой ответ, чтобы отразить тот факт, что multiArray должен быть NSMutableArray. – Sunny

Смежные вопросы