IOS: проблема с NSMutableArray - PullRequest
2 голосов
/ 19 мая 2011

У меня есть этот код;

for (int i = 0; i<period+1; i++){

    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
    [dateFormatter setDateFormat:@"dd/MM/yyyy"];
    NSDate *newData = [dataToAdd dateByAddingTimeInterval:60*60*24*j];
    j++;
    NSString *data = [dateFormatter stringFromDate:newData];
    [[appDelegate.globalArray objectAtIndex:[name intValue]]addObject:data];

    [dateFormatter release];
}

этот код работает нормально, пока я не уйду в фоновом режиме.appDelegate.globalArray - это глобальный массив, и когда я захожу в фоновом режиме, я сохраняю его с помощью NSUserDefault

- (void)applicationDidBecomeActive:(UIApplication *)application {

globalArray = [[NSMutableArray alloc] initWithArray:[[NSUserDefaults standardUserDefaults] objectForKey:@"globalArray"]];}

и

- (void)applicationDidEnterBackground:(UIApplication *)application{

[[NSUserDefaults standardUserDefaults] setObject:globalArray forKey:@"globalArray"];}

цикл работает нормально, пока я не ухожу в фоновом режиме, но при повторном открытииприложение и я вхожу в этот цикл. У меня есть исключение

"NSCFArray insertObject: atIndex:]: метод мутирования, отправляемый в неизменяемый объект"

почему?

Ответы [ 2 ]

0 голосов
/ 19 мая 2011

Является ли globalArray массивом массивов? Если это так, то вам нужно убедиться, что каждый массив в globalArray также является экземпляром NSMutableArray. Я считаю (поправьте меня, если я ошибаюсь), что когда вы возвращаете массив из NSUserDefaults, вы всегда получаете неизменный массив. То же самое касается ваших вложенных массивов.

В этом случае вы можете попробовать следующее:

- (void)applicationDidBecomeActive:(UIApplication *)application {

    NSArray *temp = [[NSArray alloc] initWithArray:[[NSUserDefaults standardUserDefaults] objectForKey:@"globalArray"]];
    NSMutableArray *result = [[NSMutableArray alloc] initWithCapacity:[temp count]];

    for (NSArray *nestedArray in temp) {
        [result addObject:[NSMutableArray arrayWithArray:nestedArray]];
    }

    // assuming globalArray is a @property retained by your class
    self.globalArray = result;

    [result release];
    [temp release];
}

Возможно, есть более эффективный способ сделать это, но вы поймете мою точку зрения ...

0 голосов
/ 19 мая 2011

Я думаю, что происходит то, что вы пытаетесь использовать insertObject: в неизменяемом массиве, потому что после добавления массива в глобальный он становится неизменным.

...