2011-06-17 78 views
0

在这段代码中,我选择了一个字典,将其修改并保存在另一个数组中。但我不知道为什么在代码的第二行,即插入的位置它崩溃的字典(发送到释放实例消息)我。如何才能解决这个将对象插入到数组中时崩溃

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

回答

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

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

[tempArray addObjectsFromArray:array]; 
1

试试这个

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

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

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

没有直接关系,但:

你的页头的两个[INIT]调用是不必要的,造成泄漏。基本上你正在做的是用分配创建一个新的空白数组,并将其分配给一个变量。然后,您立即将您的变量分配给另一个数组,从而失去对刚刚创建的空白数组/字典的引用,这意味着它无法释放。如果您稍后在代码中调用版本,则会造成麻烦。