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 中删除对象,并且所有后续对象将向上移动。

于 2013-03-10T11:16:48.433 回答
0

使用以下代码:

[bullets removeObjectAtIndex:i];

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

[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 左右)重新构建此建议。然而,基本思想是,[bullest count] 将始终为您提供数组中当前的条目数量。并且只有在不删除当前对象的情况下才必须增加索引。如果您删除它并且您的索引为 10(示例),那么下一个要检查的索引再次为 10。如果您也将其删除,那么下一个要针对 500 进行检查的时间是 10 岁。所以要么删除它,要么增加索引。并且作为循环的退出标准,根据数组中当前的对象数量检查索引。

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

于 2013-03-10T11:20:12.003 回答