2

ボタンを押してMutableArrayfavsからオブジェクトを削除すると呼び出されるこのメソッドがあります。アレイに穴が残るので、後で問題が発生します。それらの「穴」を削除する簡単な方法、またはオブジェクトを削除するためのより良い方法はありますか?

- (IBAction)addfavs:(id)sender {

int erase;
for(int i=0;i<favs.count;i++){

    if ([favs objectAtIndex:i] == parent) {

        [favs removeObjectAtIndex:i];
        erase = 1;
    }
}
if (!erase) {
    [favs addObject:parent];
}

}

4

4 に答える 4

4

可変配列からオブジェクトを削除しても、「穴を残す」ことはありません。可変配列内の他のすべてのオブジェクトは1ノッチ下に移動し、配列の数(または長さ)は削除したオブジェクトの数だけ減少します。

ユーザーインターフェイスに「穴」が表示されている場合は、テーブルビューの更新メソッドに問題があるか、配列の内容を表示している可能性があります。しかし、基本の可変配列クラスは、それ自体のオブジェクトの削除、追加、および管理を処理する方法を確実に知っています。

于 2012-06-22T14:48:11.230 に答える
4

[編集4]

user523234による素晴らしいポイント

[favs removeObjectIdenticalTo: parent];

NSMutableArrayについては、AppleのサイトでremoveObjectIdenticalToを参照してください。

https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSMutableArray_Class/Reference/Reference.html

[編集3]

オブジェクト自体ではなく、(整数値を使用して)値をチェックする例を次に示します。

int erase = 0;
int i = 0;
while(i < favs.count){
    if ([[favs objectAtIndex:i] intValue] == [parent intValue]){
        [favs removeObjectAtIndex:i];
        erase = 1;
    }else{
        i++;
    }
}

[編集2]

最初に削除しなくてもオブジェクトが追加される可能性があるのは、「消去」変数をリセットしないためです。初めて1に設定すると、それ以外の時間は設定されます!!! また、初期化することもありません。したがって、次にアクションが呼び出されたときに、コンパイラが変数をどのように処理するかを「実際に」知ることはありません。同じメモリアドレスを消去変数に「割り当てる」場合、静的変数として定義していなくても、「1」は静的条件を作成するために常駐します!!!

[編集]

もともとあなたの質問を理解していませんでした。あなたのコードをよく見て、私は今理解していると思います。

あなたのコード:

int erase = 0; 
for(int i=0;i<favs.count;i++){
    if ([favs objectAtIndex:i] == parent){
        [favs removeObjectAtIndex:i];
        erase = 1;
    }
}

基本的に、削除するたびにカウンターをインクリメントするときに、リスト内の特定のアイテムをスキップします。オブジェクト3を削除すると、カウンターはカウント4に更新されますが、4は5になり、3は4になります。したがって、この場合、基本的に項目4をスキップします。

これを試して:

int erase = 0;
int i = 0;
while(i < favs.count){
    if ([favs objectAtIndex:i] == parent){
        [favs removeObjectAtIndex:i];
        erase = 1;
    }else{
        i++;
    }
}

これは、現在のアイテムを削除していない場合にのみカウンターをアップグレードします。

[オリジナル] https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSMutableArray_Class/Reference/Reference.html

removeObjectAtIndexメソッドのメモを見てください。

Appleから直接:

「ギャップを埋めるために、インデックスを超えるすべての要素は、インデックスから1を引くことによって移動されます。」

これは、AppleのAPI内で自動的に実行される必要があります。あなたは何もする必要はないはずです、そして本当に「穴」が残っているべきではありません。

于 2012-06-22T14:49:47.603 に答える
2

NSMutableArrayからオブジェクトを削除しても、穴は残りません。Appleの配列実装はまばらなものではありません。つまり、オブジェクトを削除すると配列のサイズが変更され、空白がなくなります。

于 2012-06-22T14:48:30.437 に答える
1

@trumpetlicksの回答に加えて、これを試すこともできます:
編集:短いバージョン。

if ([favs containsObject:parent])  //check for present of parent in the favs
{
    [favs removeObjectIdenticalTo:parent];  //remove all occurrences of parent
} else
    [favs addObject:parent];
于 2012-06-22T15:25:28.657 に答える