我得到了一个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超出界限0。1‘
发布于 2012-10-06 17:25:58
问题是,NSMutableOrderedSet将初始容量视为提示而不是指令,因此插入失败的原因是系统没有分配必要的空间。来自手册(但不在insertObject文本中):
"NSMutableOrderedSet对象不像C数组。也就是说,即使在创建可变有序集时可以指定一个大小,但指定的大小被视为“提示”;该集合的实际大小仍然是0。这意味着您不能在大于集合当前计数的索引处插入对象。例如,如果一个集合包含两个对象,其大小为2,那么可以在索引0、1或2处添加对象。索引3是非法的,超出界限;如果试图在索引3(数组大小为2时)添加对象,NSMutableOrderedSet将引发异常。“
发布于 2012-10-05 15:39:50
我相信您的问题在于,您已经将条件语句设置为i<=num,这将反过来在for循环结束时提供一个100的索引。所有类似数组的结构从0开始计数,所以用i < num替换该条件应该可以解决您的问题。
编辑:使用[_offsetVals addObject:[NSNumber numberWithInt:offsetVal]]而不是insertObject:atIndex:的已经解决了。
https://stackoverflow.com/questions/12749479
复制相似问题