2010-08-28 62 views
0

我使用cocos2d为iPhone制作应用程序,我想弄清楚从同一时间从NSmutableArray和图层中移除项目的最佳方法。 我的意思是数组内的对象从ccNode继承,并包含一个ccsprite,我已经将它作为子层添加到cclayer中。下面的代码在cclayer中,它有nsmutablearray叫做bonusicons。NSMutableArray和内存dealloc

-(void) AddNewBonusIcon: (int) colour :(int) pos{ 

    BonusIcon *newbonus; 


    CGSize winSize = [[CCDirector sharedDirector] winSize]; 

    int maxX = winSize.width; 
    int maxY = winSize.height; 

    int posX, posY; 

    newbonus = [[BonusIcon alloc] init]; 


    [newbonus setBonusColour: colour]; 


    int bonusOffset = 0; 

    posX = anchorX; 
    posY = anchorY; 

    bonusOffset = [bonusIcons count]*([newbonus.bonus_sprite boundingBox].size.width/2 + 12); 

    newbonus.bonus_sprite.position = ccp(posX+bonusOffset,posY); 



    [newbonus.bonus_sprite setTag:pos]; 

    [self addChild:newbonus.bonus_sprite]; 
    [bonusIcons addObject:newbonus ]; 
    [newbonus release]; 


} 

这似乎是做我想要添加对象精灵屏幕和添加对象到nsmutablearray。当然,这可能不是正确的做法,所以如果不是这样的话,大声吼我!

接下来我尝试删除阵列中的对象和屏幕。我可以将它们从阵列中删除,没有任何问题,我只需执行以下操作:

for (int i = INITIAL_BONUSES-1; i>=0; i--) { 


    [bonusIcons removeObjectAtIndex:i]; 

} 

这当然会在屏幕上留下精灵。所以我如何处理我想要做的事情,以便我可以从屏幕中删除精灵和与精灵关联的数组中的对象。我可以通过使用标签和打字从屏幕上移除精灵。[self removeChildByTag:i cleanup:YES];但是当我尝试从数组中删除项目时出现错误。我假设因为我已经删除了一部分对象,并且ccnode的dealloc不能再找到要释放的精灵了? 所以任何指针/提示等我应该如何做到这一点将不胜感激。我已经阅读了一堆关于内存管理的内容,我认为这是我当前的问题,但我似乎没有把它做对。 谢谢所有

编辑:好,因为发布这个我已经从ccnode本身删除精灵dealloc,并将其添加到它上面的cclayer。这已经停止了崩溃,所以我想我对我遇到的问题是正确的。我当然不认为我解决这个问题的方式是最理想的方式,但是直到我找到更好的方式时才会这样做。

+0

使用自动释放并不遗余力自己不得不与释放ALLOC相匹配的麻烦......看到了cocos2d是怎么做的与他们的静态初始化自动释放(在CCNode如+(ID)节点) – LearnCocos2D 2010-08-29 08:41:01

回答

1

你没有在你发布的代码中,但你的问题似乎强烈暗示你打电话给dealloc。在课程的dealloc方法结束时,唯一应该叫dealloc的地方是[super dealloc]。在除super之外的任何地方调用它都是错误的,并会导致关于过早释放对象的错误(因为它就是这样)。

如果这是您正在做的事情,我强烈建议您阅读Apple的memory management guide。它展示了可可非常简单但彻底地进行内存管理的工作方式。

+0

对不起,我彪说,不发布的dealloc – glogic 2010-08-28 21:49:27

+0

但问题已经解决了,现在我才意识到我是如何在多个地方发布精灵的。现在有更多的人关注这个问题,我已经摸索了这么久了 – glogic 2010-08-28 21:57:56