質問: NSEnumerator 反復で現在のオブジェクトのインデックスを取得するにはどうすればよいですか?
(速度上の理由から、整数カウンターを使用して物事を追跡したり、for ループを使用したりしたくありません。どうやってやったのか思い出せなくなる前にやったのです...)
質問: NSEnumerator 反復で現在のオブジェクトのインデックスを取得するにはどうすればよいですか?
(速度上の理由から、整数カウンターを使用して物事を追跡したり、for ループを使用したりしたくありません。どうやってやったのか思い出せなくなる前にやったのです...)
for
ループ内で整数カウンターを使用すると、速度の問題が発生する可能性があります。インデックスの記録を自分で保持するよりも、列挙子から特定のオブジェクトのインデックスを見つけようとする方が遅くなる可能性が高くなります。繰り返されるメッセージのディスパッチを回避したい場合は、NSArray のgetObjects:range:
メソッドを参照してください。
size_t count = [myArray count];
id *objects = calloc(count, sizeof(id));
[myArray getObjects:objects range:NSMakeRange(0, count)];
// if you have a very large count, you'll save doing an
// "objectAtIndex:" for each item.
for (int i = 0; i < count; i++)
[objects[i] doSomething];
free(objects);
信じられないほど大きな配列のパフォーマンスの違いはおそらく最小限に抑えられますが、内部の最適化を過小評価しないでください。のドキュメントでさえ、getObjects:range:
この目的でこの手法を使用することを思いとどまらせています。
NSArrayは、メッセージからindexOfObject:
返されるまですべての要素を反復処理します (これにはさらにメッセージの送信が含まれる場合があります)。YES
isEqual:
インデックスを要求しているので、配列を使用していると想定できます。もしそうなら:
[array indexOfObject:currentObject];
ほとんどの場合に機能します (ただし、すべてではありません)。ただし、int カウンターを使用して通常の for ループを使用するように切り替えると、全体的には高速になります。