2012-03-06 71 views
1

一段时间以来,一直在为iOS的塔防游戏工作。我正在使用Cocos2d(v0.99.5不确定)。当我开始移除精灵时,最近开始陷入一些问题。如何调试Cocos2d精灵内存删除问题

在使用仪器和僵尸型材和这里就是我得到:

Zombie trace 代码用于更新精灵(并删除)位于更新:

-(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:或者说我的“解决方案”处理弹丸蠕变从记忆的角度来看,关系是不好的。关于如何解决这个问题或进一步调试的任何想法?

回答

3

你的快速枚举技术通过数组将转换为该数组中的所有精灵作为CCSprite的自定义子类,然后检查它们是否是一个不同的自定义子类,如Tower等。将此视为健康的编程习惯,因为一个类中的方法可能不在另一个类中,但是仍然在施放它们。

这可能会或可能不会导致您的问题,但更明智的做法是为特定班级的孩子保留一个assign iVar CCArray。即将所有射弹放入一个阵列,并将其添加到批处理节点,然后通过遍历这些单个阵列来遍历所有射弹,塔架等,在那里您知道它们已经是什么类别。然后在必要时将它们从数组以及父级中移除。我认为这比通过整个游戏中所有游戏中的精灵都要安全得多,这些精灵可能包括未被使用的spites,并将它们投射并测试为不同的类。

+0

谢谢。通过创建三个新数组解决它,并通过它们枚举。希望跳过这个,但似乎迭代通过textureAtlas的孩子是不是一个安全的方法来做到这一点。 – Sunkas 2012-03-28 08:48:21

+0

听到它使用更安全的技术,这真是太棒了。这确实是正确的做法。 – johnbakers 2012-03-28 09:04:58