一段時間以來,一直在爲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