一段时间以来,一直在为iOS的塔防游戏工作。我正在使用Cocos2d(v0.99.5不确定)。当我开始移除精灵时,最近开始陷入一些问题。如何调试Cocos2d精灵内存删除问题
在使用仪器和僵尸型材和这里就是我得到:
代码用于更新精灵(并删除)位于更新:
-(void) update:(ccTime)deltaTime {
if (paused)
return;
CCArray *childs = [textureAtlas children];
//Update all objects
for (GameSprite *tempChar in childs) {
if ([tempChar respondsToSelector:@selector(updateStateWithDeltaTime:andListOfGameObjects:andAtlas:)]) {
[(GameSprite*)tempChar updateStateWithDeltaTime:deltaTime andListOfGameObjects:[textureAtlas children] andAtlas:textureAtlas];
}
}
//Remove dead projectiles
for (GameSprite *tempChar in childs) {
if ([tempChar isKindOfClass:Projectile.class]) { //(**)
if (![tempChar alive]) {
[tempChar remove];
}
}
}
//Remove dead towers
for (GameSprite *tempChar in childs) {
if ([tempChar isKindOfClass:Tower.class]) {
if (![tempChar alive]) {
[tempChar remove];
}
}
}
//Remove dead creeps
for (GameSprite *tempChar in childs) {
if ([tempChar isKindOfClass:Creep.class]) {
if (![tempChar alive]) {
[tempChar remove];
}
}
}
}
在删除方法GameSprite.m:
-(void)remove {
CCLOG(@"remove");
[self removeFromParentAndCleanup:YES];
}
第一个块更新SpriteBatchNode/textureAtlas中的精灵。剩余的三个块检查不同的对象是否应该删除。 (他们的活性变量设置为否?)。我有三种不同类型的原因是因为弹丸对于它们正在拍摄的蠕变有(弱)参考,并且在蠕变之前需要删除。
所以我的问题是,当一个弹丸撞击一个蠕变和投射(和所有其他射弹在那个蠕变射击)将被删除时,它随机崩溃)。 creeps引用计数降到0,但似乎仍然在childs数组中。原因我得到的错误是:
*** -[NormalProjectile isKindOfClass:]: message sent to deallocated instance 0xff33e30
对我标有(**)
行无论该问题是否与我理解的cocos2d的removeFromParentAndCleanUP:或者说我的“解决方案”处理弹丸蠕变从记忆的角度来看,关系是不好的。关于如何解决这个问题或进一步调试的任何想法?
谢谢。通过创建三个新数组解决它,并通过它们枚举。希望跳过这个,但似乎迭代通过textureAtlas的孩子是不是一个安全的方法来做到这一点。 – Sunkas 2012-03-28 08:48:21
听到它使用更安全的技术,这真是太棒了。这确实是正确的做法。 – johnbakers 2012-03-28 09:04:58