0

次のようなコードを書くことはできますか?動作しているようですが、許可されている/安全であることを確認したいと思います。

// menu is a NSMenu*
for (NSMenuItem *item in [menu itemArray]) {
    if (some condition) {
        [menu removeItem:item];
    }
}
4

2 に答える 2

0

すぐに例外をスローしない場合(列挙時に配列を直接変更する場合など)、おそらく問題ありません。NSMenu内部配列のコピーを提供している可能性があります(アイテムをに保持していると仮定しますNSArray)。

ただし、安全性を保証するために、これを2つのステップで実行することをお勧めします。削除するアイテムを保持する別の配列を作成し、それを列挙て削除を実行します。

NSMutableArray * itemsToRemove = [NSMutableArray array];
for( NSMenuItem *item in [menu itemArray] ){
    if( some condition ){
        [itemsToRemove addObject:item];
    }
}

for( NSMenuItem * item in itemsToRemove ){
    [menu removeItem:item];
}
于 2012-07-25T03:13:32.493 に答える
0

念のために
言っておきますが、メモリに関心があり、セカンダリアレイを作成したくない場合は、次を使用してください。

for (int i = menu.itemArray.count - 1; i >= 0; --i)
{
    if( some condition for index i ){
        [menu removeItemAtIndex:i];
    }
}
于 2014-05-06T09:55:47.493 に答える