1

NSMutableArrayオブジェクトに置き換えたいコンテンツがありますNSNull

これが私がすることです:

NSMutableArray* nulls = [NSMutableArray array];

for (NSInteger i = 0; i < myIndexes.count; i++)
    [nulls addObject:[NSNull null]];

[stageMap replaceObjectsAtIndexes:myIndexes withObjects:nulls];

どうすればこれをより効率的に行うことができますか? 配列の内容を 1 つずつ置き換えることができるように、NSIndexSet を列挙する方法はありますか?

解決済み

推奨される方法は 2 倍高速であることが判明しました (平均 0.000565 秒 vs 0.001210 秒):

if (myIndex.count > 0)
{
    NSInteger index = [myIndex firstIndex];

    for (NSInteger i = 0; i < myIndex.count; i++)
    {
        [stageMap replaceObjectAtIndex:index withObject:[NSNull null]];
        index = [myIndex indexGreaterThanIndex:index];
    }
}
4

2 に答える 2

1

forループを使用できます。最初のインデックスから開始し、 を使用indexGreaterThanIndex:して次のインデックスを取得し、最後のインデックスに到達したら停止します。

空のインデックス セットを考慮することを忘れないでください。その場合、最初と最後のインデックスの両方が使用さNSNotFoundれます。最も簡単な方法は、インデックス セットのカウントをテストすることです。ゼロの場合、ループしません。

また、Jason Coco がプロファイリングについて語ったこと。プログラムが動作するまで効率についてあまり心配する必要はありません。また、Shark (またはそれが好みなら Instruments) を実行して何が遅いかを正確に見つけるまでは、最適化に取り掛からないでください。

于 2009-04-12T07:27:33.143 に答える
0

これは非常に古い質問だと思いますが、他の誰かがあなたが使用できるこの質問を見つけた場合に備えて、ここに投稿します。

    [indexes enumerateIndexesUsingBlock:^(NSUInteger idx, BOOL *stop) {
        NSLog(@"index: %d", idx);
        [objectArray replaceObjectAtIndex:idx 
                               withObject:newObject];
    }];

これははるかに簡潔です。

于 2012-07-03T21:07:53.293 に答える