1

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

我将对象(画笔颜色)添加到 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]];
4

1 回答 1

2

index 是 newpaths 中对象路径的索引,但是您使用此索引访问 arr3 中的对象,而不是 newpaths 中的对象。您确定 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 方法)但在比较之后您以某种方式更改了对象的状态。

于 2012-11-09T21:09:52.233 回答