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 減らし、正確に正しいことを行います。)