0

我收到一个 NSRangeException 错误,我在这段非常基本的代码中找不到错误。有人可以帮助纠正我的盲点吗?

uint32_t offsetVal = 0;
int num = 100;
_offsetVals=[[NSMutableOrderedSet alloc]initWithCapacity:num+1];
for (int i=0; i<=num; i++) // note: there is 1 greater offset record than there is glyphs!
{
    CFDataGetBytes(tableData, CFRangeMake(offset,4),(UInt8*)&offsetVal);
    offsetVal=CFSwapInt32HostToBig(offsetVal);
    [_offsetVals insertObject:[NSNumber numberWithInt:offsetVal] atIndex:i];
    offset+=4;
}

然而应用程序崩溃:'NSRangeException',原因:' * -[__NSOrderedSetM setObject:atIndex:]: index 3 beyond bounds [0 .. 1]'

4

2 回答 2

1

我相信你的问题是你已经设置了你的条件语句,i<=num这反过来会在你的 for 循环结束时提供一个 100 的索引。所有类似数组的结构都从 0 开始计数,因此用替换该条件i < num应该可以解决您的问题。

编辑: 使用[_offsetVals addObject:[NSNumber numberWithInt:offsetVal]]而不是insertObject:atIndex:已经解决了。

于 2012-10-05T15:39:50.217 回答
0

问题是 NSMutableOrderedSet 将初始容量视为提示而不是指令,因此由于系统没有分配必要的空间,因此插入在几次内失败。从手册(但不在 insertObject 文本中):

“NSMutableOrderedSet 对象不像 C 数组。也就是说,即使你可以在创建可变有序集合时指定大小,指定的大小也被视为“提示”;集合的实际大小仍然为 0。这意味着您不能在大于集合当前计数的索引处插入对象。例如,如果集合包含两个对象,则其大小为 2,因此您可以在索引 0、1 或 2 处添加对象。索引 3 是非法且超出范围;如果您尝试在索引 3 处添加对象(当数组大小为 2 时),NSMutableOrderedSet 会引发异常。”

于 2012-10-06T17:25:58.933 回答