IOS:NSMutableArray的问题

时间:2011-05-19 09:22:47

标签: cocoa-touch exception nsmutablearray nsuserdefaults

我有这段代码;

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:]:发送到不可变对象的mutating方法”

为什么呢?

2 个答案:

答案 0 :(得分:0)

我认为正在发生的事情是你试图在一个不可变数组中使用 insertObject:,因为一旦你将数组添加到全局它就变成了不可变的。

答案 1 :(得分:0)

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

可能有更有效的方法来做到这一点,但你明白了我的意思......