移除子项后NSMutablearray计数不会更改

时间:2013-03-10 11:13:51

标签: objective-c cocos2d-iphone

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向下整数并将数组调整为已移除的对象

3 个答案:

答案 0 :(得分:0)

使用

[bullets removeObjectAtIndex:i];
  

如何从数组中移除子项以及中的对象   数组,以便bulletCount向下整数并调整数组   移除对象

使用上述方法将从索引i中删除对象,并且所有后续对象都将向上移动。

答案 1 :(得分:0)

使用以下代码:

[bullets removeObjectAtIndex:i];

从bulet数组中获取项目符号并使用下面的代码。

[bullet removeFromParentAndCleanup:YES];

答案 2 :(得分:0)

GMSprite *bulletMove;


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

在其体内操纵for循环的索引varialbe并不是完全好的样式。您可能希望使用其他类型的循环(do-while左右)重新构造此建议。但是,基本思路是[bullest count]将始终为您提供阵列中当前的条目数量。如果不删除当前对象,则只能增加索引。如果你删除它,你的索引是10(例子),那么下一个要检查的是再次为10。如果你也删除了那个,那么下一个要针对500检查的是10的agein。所以要么删除它,要么增加索引。并且作为循环的退出条件,检查索引与数组中对象的当前数量。

编辑:问题的第二部分:如果你正确地进行内存管理,无论你是否使用ARC,removeObjectAtIndex都应该正确删除对象本身。 (除非它的保留计数高于1,否则仍然存在另一个强引用。但即使这样,它也会将保留计数减少1并完全正确。)