1

、、 、 のMyClass4 つのプロパティを持つのさまざまなインスタンスを含む配列があります。場合によっては、特定のインスタンスのプロパティを変更する必要があります (この例では、 と等しいとしましょう)。int idint valueAint valueBint valueCid5

現在、私は次のようにしています:

MyClass *myClass = [[MyClass alloc] init];

for (int i = 0; i < [myMutableArray count]; i++)
{
    myClass = [myMutableArray objectAtIndex:i];

    if(myClass.id == 5)
    {
        myClass.valueA = 100;
        myClass.valueB = 200;
        myClass.valueC = 300;
        [myMutableArray replaceObjectAtIndex:i withObject: myClass];
    }
}

これを行うためのより良い(より効率的とは言いたくない)方法はありますか?

4

5 に答える 5

3

が 5 のインスタンスが 1 つしかないことがわかっている場合は、更新を行った後にステートメントの最後にida を追加します。これにより、ループの繰り返しが終了し、おそらく最も効率的です。break;if

プロファイリングを行わない場合、実行時のパフォーマンスについてあまり心配する必要はありません。

より少ないコードを記述するには、次のように記述できますfor

for (MyClass *myClass in myMutableArray) {

とにかく頻繁に個々のアイテムにアクセスする必要がある場合は、ストレージに配列を使用しないように変更することをお勧めします。

また、しないでください:

MyClass *myClass = [[MyClass alloc] init];

決して使用せず、破棄されるだけのインスタンスを不必要に作成しているためです。

于 2013-07-25T19:51:03.727 に答える
2

コードを最適化する簡単な方法が 2 つあります。まず、配列内の myClass インスタンスを置き換えるための新しいオブジェクトの元の割り当ては不要です。これはポインターであるため、実際には配列内のオブジェクトを直接操作しています。次に、インクリメンタを使用して現在の for ループを保持すると、MyClass の元の割り当ては不要になります。必要なのはポインターだけなので、 alloc と init を実行する必要はありません。ただし、インクリメント for ループではなく for in ループを使用して、配列を直接ループすることもできます。

最終的なコード:

for (MyClass *myClass in myMutableArray)
{
    if(myClass.id == 5)
    {
        myClass.valueA = 100;
        myClass.valueB = 200;
        myClass.valueC = 300;
    }
}
于 2013-07-25T19:54:23.460 に答える
2

過度の最適化を開始する前に、これがパフォーマンスのボトルネックであると確信していますか?

1 つの代替手段はNSMutableDictionary、キーが の である にNSNumberインスタンスを保持することidです。次に、特定のものを更新する必要がある場合は、インスタンスを直接取得できます[myMutableDictionary objectForKey:@(someIntId)]。これにより、O(n) ループが O(1) ハッシュ テーブル ルックアップに変わります [適切なhash実装を想定するか、最悪の場合 O(log n) になります]。

于 2013-07-25T19:47:37.850 に答える
0

まず第一にid、Objective では変数に名前を付けたくありません。C.idは任意の型へのポインターを意味し、予約済みのキーワードです。

これを行うためのより優れた/より効率的な方法は、高速列挙と呼ばれます。高速列挙は、リスト/配列/セット内の各項目を反復処理する特別な方法です。コードは次のようになります。

for (MyClass *iteratorObject in myMutableArray) {
    if (iteratorObject.id == 5) {
        //do what you want with that specific object
        //insert your modified object back into mutable array
    }

これが最も簡単な方法ですが、1 つのルールに違反しています。配列で高速列挙を実行しているときに、オブジェクトを編集/追加/削除することは決して想定されていません。[myMutableArray copy]私の解決策は、 immutableArray を返す単に呼び出してから、それを反復処理することです。

于 2013-07-30T15:33:06.243 に答える