2012-10-05 4 views
0

NSRangeException 오류가 발생하며이 매우 기본적인 비트 코드에서 오류를 찾을 수 없습니다. 누군가가 내 맹점을 바로 잡는 데 도움이 될 수 있습니까?NSMutableOrderedSet 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

NSMutableOrderedSet은 명령어가 아니라 초기 용량을 힌트로 간주하므로 시스템에서 필요한 공간을 할당하지 않아 삽입이 실패했습니다. (insertObject 텍스트가 아닌)

"NSMutableOrderedSet 객체는 C 배열과 비슷하지 않습니다. 즉, 가변 순서 집합을 만들 때 크기를 지정할 수 있지만 지정된 크기는 a로 간주됩니다. "힌트", 집합의 실제 크기는 여전히 0입니다. 즉, 집합의 현재 개수보다 큰 인덱스에 개체를 삽입 할 수 없습니다. 예를 들어 집합에 두 개의 개체가 포함되어있는 경우 크기는 2이므로 인덱스 0, 1 또는 2에 객체를 추가 할 수 있습니다. 인덱스 3은 유효하지 않고 범위를 벗어났습니다. 인덱스 3에 객체를 추가하려고하면 (배열의 크기가 2 일 때) NSMutableOrderedSet이 예외를 발생시킵니다. "

1

저는 믿습니다 귀하의 문제는 당신의 조건문을 i<=num으로 설정하고 for 루프의 끝에서 100의 인덱스를 제공한다는 것입니다. 모든 배열과 같은 구조체는 0부터 계산하기 시작하므로이 조건을 i < num으로 바꾸면 문제가 해결됩니다.

편집 : 대신 insertObject:atIndex:[_offsetVals addObject:[NSNumber numberWithInt:offsetVal]]는 많은 일 사용.

+0

앱의 메시지에 i = 3에서 충돌이 발생합니다. 아니, NSMutableOrderedSet의 실제 한계 근처. 하지만 최대 +1 문제를 알아 줘서 고마워! – user216661

+0

내 파일이 손상되었는지 궁금합니다. 파일을 삭제하고 다시 입력하려고합니다. – user216661

+0

거기에 행운이 없습니다. 한숨. – user216661