我收到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:]:索引3超出边界[0 .. 1]'
答案 0 :(得分:1)
我相信你的问题就是你已经将条件语句设置为i<=num
,这将在你的for循环结束时提供100的索引。所有类似数组的结构都从0开始计数,因此用i < num
替换该条件可以解决您的问题。
修改强>
使用[_offsetVals addObject:[NSNumber numberWithInt:offsetVal]]
代替insertObject:atIndex:
已经成功。
答案 1 :(得分:0)
问题是NSMutableOrderedSet将初始容量视为提示而不是指令,因此插入失败的原因很少,因为系统没有分配必要的空间。从手册(但不在insertObject文本中):
“NSMutableOrderedSet对象与C数组不同。即,即使您在创建可变有序集时指定了大小,指定的大小也被视为”提示“;集合的实际大小仍为0这意味着您不能在大于当前计数集的索引处插入对象。例如,如果集合包含两个对象,则其大小为2,因此您可以在索引0,1或2处添加对象。索引3是非法的并且超出范围;如果您尝试在索引3处添加对象(当数组的大小为2时),NSMutableOrderedSet会引发异常。“