NSMutableArray对象边界出了什么问题?

时间:2012-11-09 20:54:16

标签: iphone objective-c ios xcode nsmutablearray

我有一个绘图应用程序,当用户关闭并重新打开应用程序时,当用户绘制并加载时会保存路径。

我将对象(画笔颜色)添加到NSMutableArray,然后像这样保存它们:

// Adding object to NSMutableArray (this is in touchesMoved)
NSData *colorData = [NSKeyedArchiver archivedDataWithRootObject:self.brushColor];
[self.brushColours addObject:colorData];

// Saving array (this is in touchesEnded)
[defaults setObject:self.brushColours forKey:[NSString stringWithFormat:@"%@BrushColours%@", currentid, pageno]];
[defaults synchronize];

这一切都很好,但是当我尝试加载路径并设置颜色时,会发生这种情况:

为什么会这样?

编辑:我正在加载这些颜色(这是每个路径的for循环):

NSMutableArray *arr3 = [defaults objectForKey:[NSString stringWithFormat:@"%@BrushColours%@", currentid, pageno]];
self.brushColor = [NSKeyedUnarchiver unarchiveObjectWithData:[arr3 objectAtIndex:index]];

1 个答案:

答案 0 :(得分:2)

index是newpaths中对象路径的索引,但是您使用此索引来访问arr3中的对象,而不是newpath中的对象。您确定newpaths数组具有相同的长度或arr3吗?在这之前做一些断言:

NSAssert([arr3 count]>=[newpaths count], @"newpaths is longer than arr2");

这在循环之前。可能这个断言不正确,因为正如您的异常所说,索引超出了arr3界限,除非您以某种方式修改循环内的arr3数组。
在访问它的元素之前测试arr3:

NSAssert(index<[arr3 count], @"Index out of bounds");
NSMutableArray *arr3 = [defaults objectForKey:[NSString stringWithFormat:@"%@BrushColours%@", currentid, pageno]];
self.brushColor = [NSKeyedUnarchiver unarchiveObjectWithData:[arr3 objectAtIndex:index]];

肯定一个断言会失败,你会更准确地知道(但不完全准确)什么是错的。通过再次调查,你可以得到这个错误的原因(如果你不能单独实现这个,也会发布更多代码)

修改

替代解决方案:目前尚不清楚您要做什么,但我想您想在arr3中找到该对象并取消归档。
所以你可以使用indexOfObject:

id obj= [newpaths objectAtIndex: index];
NSUInteger validIndex=[arr3 indexOfObject: obj];
if(validIndex!= NSNotFound)
    self.brushColor = [NSKeyedUnarchiver unarchiveObjectWithData:[arr3 objectAtIndex: validIndex]];

PS:无论如何你可以直接取消归档obj,除非对象结果相等(isEqual方法)但是在比较之后你以某种方式改变了对象的状态。