NSMutableArray和内存dealloc

时间:2010-08-28 17:46:28

标签: iphone objective-c cocos2d-iphone

我正在使用cocos2d为iphone制作应用程序,我正在尝试找出从NSmutableArray和同时从图层中删除项目的最佳方法。 我的意思是,数组中的对象继承自ccNode并包含一个ccsprite,我已将其作为子项添加到cclayer中。下面的代码位于一个cclayer中,它有一个名为bonusicons的nsmutablearray。

-(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。这已经停止了崩溃,所以我想我对我遇到的问题是正确的。我当然不认为我解决它的方式是最理想的方式,但它会一直找到更好的方式。

1 个答案:

答案 0 :(得分:1)

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

如果您正在做的事情,我强烈建议您阅读Apple的memory management guide。它简单而彻底地阐述了Cocoa中的内存管理是如何工作的。