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