我正在使用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。这已经停止了崩溃,所以我想我对我遇到的问题是正确的。我当然不认为我解决它的方式是最理想的方式,但它会一直找到更好的方式。
答案 0 :(得分:1)
您在发布的代码中没有它,但您的问题似乎强烈暗示您正在调用dealloc
。在课程的dealloc
方法结束时,您应该拨打[super dealloc]
的唯一地方是dealloc
。除super
或任何其他地方之外的任何地方调用它都是错误的,并且会导致过早释放对象的错误(因为,这就是它的作用)。
如果您正在做的事情,我强烈建议您阅读Apple的memory management guide。它简单而彻底地阐述了Cocoa中的内存管理是如何工作的。