2009-04-12 11 views
1

私はNSMutableArrayのコンテンツを持っています。置き換えたいのはNSNullのオブジェクトです。複数の配列の内容を1つのオブジェクトに置き換える?

これは私が何をすべきかです:

NSMutableArray* nulls = [NSMutableArray array]; 

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

[stageMap replaceObjectsAtIndexes:myIndexes withObjects:nulls]; 

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

が解決

提案された方法は、(0.001210s対平均0.000565s)2倍に高速であることが判明:

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]; 
    } 
} 
+0

これは非効率的ですか?つまり、アプリケーションのプロファイルを作成するときに、このコードの断片が大きく減速していますか? –

答えて

1

あなたはforループを使用することができます。最初のインデックスから開始し、indexGreaterThanIndex:を使用して次のインデックスを取得し、最後のインデックスをヒットした後に停止します。

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

また、Jason Cocoがプロファイリングについて述べたこともあります。あなたのプログラムがうまく動作するまで効率をあまり気にしないで、シャーク(またはインストゥルメント、それがあなたのものならば)を実行し、遅いものが見つかるまで、最適化するつもりはありません。

+0

チップをありがとう。私はこれをベンチマークして、新しいアプローチがより速いかどうかを見てみよう。 – hyn

0

誰があなたが使用することができ、この質問を見つけた私は、これは非常に古い質問です実現が、私は場合にはここに掲示しています:

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

たくさんより簡潔でどちら。

関連する問題