将对象插入数组时崩溃

时间:2011-06-17 13:20:12

标签: iphone nsmutablearray nsmutabledictionary

在这个代码来自一个数组我选择一个字典,修改它并保存回另一个数组。但我不知道为什么在这个代码的倒数第二行,即我插入字典时它崩溃了(消息发送解除分配的实例)。我可以解决这个问题吗

        NSArray *array=[NSArray arrayWithContentsOfFile:plistPath];
        NSLog(@"array before %@",array);
        NSMutableArray *tempArray=[[NSMutableArray alloc]init];
        tempArray=(NSMutableArray*)array;
        NSMutableDictionary *dictToBeChanged=[[NSMutableDictionary alloc]init];
        dictToBeChanged=[tempArray objectAtIndex:indexPath.row];
        [dictToBeChanged setObject:[NSNumber numberWithBool:YES] forKey:@"isPaid"];
        [tempArray removeObjectAtIndex:indexPath.row];
        [tempArray insertObject:dictToBeChanged atIndex:indexPath.row];
        NSLog(@"array after %@",tempArray);

4 个答案:

答案 0 :(得分:2)

当你将array分配给tempArray时,你不会因为你施放它而使它变得可变。

这是NSArray,因此您无法添加/删除其对象。

此外,还有一些不必要的初始化(tempArray和dictToBeChanged),因为在初始化之后你正在用其他东西覆盖这些变量(从而产生泄漏)。

你需要的可能是这样的:

NSMutableArray *array = [NSMutableArray arrayWithContentsOfFile:plistPath];
NSMutableDictionary *dictToBeChanged = [[[array objectAtIndex:indexPath.row] mutableCopy] autorelease];
[dictToBeChanged setObject:[NSNumber numberWithBool:YES] forKey:@"isPaid"];
[array replaceObjectAtIndex:indexPath.row withObject:dictToBeChanged];

请注意,此代码不会对plist的内容进行任何验证。

答案 1 :(得分:1)

您可能希望将对象添加到tempArray作为temparray,如下所示:

[tempArray addObjectsFromArray:array];

答案 2 :(得分:1)

试试这个

  NSMutableArray *temp;
temp=[temp arrayByAddingObjectsFromArray:(NSArray *)otherArray];

答案 3 :(得分:1)

您正在查看内存管理问题。试试这个:

NSMutableArray *array = [NSMutableArray arrayWithContentsOfFile:plistPath];//Temp array is unecessary
NSMutableDictionary *dictToBeChanged; //No need to allocate a new instance

没有直接相关但是:

您的alloc [init]调用都是不必要的,并导致泄漏。基本上你正在做的是创建一个带有分配的新空白数组,并将其分配给变量。然后你立即将你的变量分配给另一个数组,失去对刚刚创建的空白数组/字典的引用,这意味着它无法释放。如果您稍后在代码中调用release,则会导致问题。