2012-03-06 48 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