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', reason: ' * -[__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 つのオブジェクトが含まれている場合、そのサイズは 2 であるため、インデックス 0、1、または 2 にオブジェクトを追加できます. インデックス 3 は違法で範囲外です。インデックス 3 (配列のサイズが 2 の場合) にオブジェクトを追加しようとすると、NSMutableOrderedSet は例外を発生させます。"

于 2012-10-06T17:25:58.933 に答える