2012-02-20 13 views
0

我最近發佈了一個問題here關於我遇到的一些內存問題。現在我已經修好了,這要歸功於這個美妙的社區,但我面臨着另一個問題。我使用Cocos2d開發遊戲,我試圖從數組中刪除一個Sprite。當我嘗試釋放我用來跟蹤要移除的精靈的臨時數組時,問題就出現了。已發佈數組EXC_ACCESS_ERROR和Cocos2D

NSMutableArray *spritesToRemove = [[NSMutableArray alloc] init]; 

    // Loop through all sprites 
    for(CSSprite *sprite in _sprites){ 
     if(sprite.toRemove){ 
      [spritesToRemove addObject: sprite]; 
     } 
    } 

    // loop through sprites to be removed 
    for(CSSprite *removeableSprite in spritesToRemove){ 

     [_sprites removeObject: removeableSprite]; 

     // Cocos2d code to remove a sprite 
     [self removeChild: removeableSprite cleanup: YES]; 
    } 

    [spritesToRemove release]; // EXC_BAD_ACCESS error 

我得到一種感覺,我得到了錯誤的原因是因爲我釋放精靈對象[self removeChild: removeableSprite cleanup: YES];實際上釋放前陣。如果我刪除[spritesToRemove release]這行,但是我顯然會在我手上發生內存泄漏,這一切都可以正常工作。

我試着走動去除精靈的,我可以得到通過完全省略線[self removeChild: removeableSprite cleanup: YES];排序記憶的事情,但隨後的Cocos2D從CCNode內以-(void) visit

感謝[child visit];再次拋出同樣的錯誤EXC_BAD_ACCESS您的幫助:-)

編輯:我啓用NSZombie,我得到這個消息:

*** -[Sprite release]: message sent to deallocated instance 0xfa94cf0

對於我來說,這對我來說意味着我最初的想法,陣列中的某個條目即將發佈。這是正確的嗎?無論如何,如果有,我可以找出哪裏?

+1

就我所見,這一切看起來都很好。只有我能看到的是,如果你的精靈中的一個「刪除」在你進入本節之前將自己從清除中移除了FromFromParent,那麼如果孩子已經被刪除,Coco的removeChild方法將默默無聞。 – YvesLeBorg 2012-02-20 03:38:08

+0

@YvesLeBorg他們怎麼能做到這一點?我有另一個保持數組中的精靈屬性的類,可以將它解除分配嗎? – Peter 2012-02-20 03:53:26

+1

不確定,我沒有看到你所有的代碼。你的_sprites數組在這部分代碼中似乎與[self children]數組不同步。在那裏的某處,你可能有一個過程,從這個過程中刪除孩子,而不會將好消息告訴_sprites數組。 – YvesLeBorg 2012-02-20 04:08:54

回答

0

我設法找到問題(說實話我覺得有點傻:-P)。一旦我將它添加到數組中,我就手動發佈了這個sprite,這不在提供的代碼中,所以你們不可能找到它。精靈已經被設置爲自動釋放,因此被清除兩次 - 導致我的錯誤。

+1

ARC的另一種情況;) – LearnCocos2D 2012-02-21 23:02:33