gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 11:06:40 24 4
gpt4 key购买 nike

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

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

最佳答案

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

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

这在循环之前。可能这个断言是不正确的,因为正如你的异常(exception)所说,索引超出了 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 方法)但在比较之后你以某种方式改变了对象的状态。

关于iphone - NSMutableArray 对象边界出了什么问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13315859/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com