0
GMSprite *bulletMove;
int bulletCount = [bullets count];

for(int i = 0; i < bulletCount; i++)
{        
    if(bulletMove.position.x > 500)
    {
        [self removeChild:[bullets objectAtIndex:i] cleanup:YES];
    }
}

配列から子を削除し、配列内のオブジェクトも削除して、 bulletCount が整数を減らし、配列を削除されたオブジェクトに調整する方法

4

3 に答える 3

0

使用する

[bullets removeObjectAtIndex:i];

配列から子を削除し、配列内のオブジェクトも削除して、 bulletCount が整数を減らし、配列を削除されたオブジェクトに調整する方法

上記の方法を使用すると、インデックス i からオブジェクトが削除され、後続のすべてのオブジェクトが 1 つ上に移動します。

于 2013-03-10T11:16:48.433 に答える
0

以下のコードを使用します。

[bullets removeObjectAtIndex:i];

弾丸配列から弾丸オブジェクトを取得し、以下のコードを使用します。

[bullet removeFromParentAndCleanup:YES];
于 2013-03-10T11:17:45.157 に答える
0
GMSprite *bulletMove;


for(int i = 0; i < [bullets count]; )
{        
    if(bulletMove.position.x > 500)
    {
        [bullets removeObjectAtIndex:i];
    } else {
        i++;
    }
}

本体内で for ループのインデックス変数を操作するのは、あまり良いスタイルではありません。別の種類のループ (do-while など) を使用して、この提案を再構築することをお勧めします。ただし、基本的な考え方は、[bullet count] は常に配列内の現在のエントリ数を提供するというものです。また、現在のオブジェクトを削除しない場合にのみ、インデックスを増やす必要があります。それを削除すると、インデックスは 10 になり (例)、次にチェックされるインデックスは再び 10 になります。それも削除すると、次に 500 に対してチェックされるのは 10 の年齢です。したがって、それを削除するか、インデックスを増やします。そして、ループの終了基準として、配列内のオブジェクトの現在の量に対してインデックスをチェックします。

編集:質問の2番目の部分:ARCを使用しているかどうかに関係なく、メモリ管理を正しく行うと、removeObjectAtIndexはオブジェクト自体を適切に削除する必要があります。(その保持カウントが 1 より大きいか、別の強力な参照がまだ存在する場合を除きます。ただし、その場合でも保持カウントを 1 減らし、正確に正しいことを行います。)

于 2013-03-10T11:20:12.003 に答える