Iphone NSMutableArray和内存释放
我正在用cocos2d为iphone制作一个应用程序,我正在试图找出同时从NSmutableArray和层中删除项目的最佳方法。 我的意思是,数组中的对象继承自ccNode,并包含我作为子对象添加到cclayer的ccsprite。下面的代码位于一个cclayer中,该层具有名为bonusicons的nsmutablearrayIphone NSMutableArray和内存释放,iphone,objective-c,cocos2d-iphone,Iphone,Objective C,Cocos2d Iphone,我正在用cocos2d为iphone制作一个应用程序,我正在试图找出同时从NSmutableArray和层中删除项目的最佳方法。 我的意思是,数组中的对象继承自ccNode,并包含我作为子对象添加到cclayer的ccsprite。下面的代码位于一个cclayer中,该层具有名为bonusicons的nsmutablearray -(void) AddNewBonusIcon: (int) colour :(int) pos{ BonusIcon *newbonus; CG
-(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本身删除了sprite dealloc,并将其添加到其上方的cclayer中。这已经停止了碰撞,所以我想我的问题是对的。当然,我不认为我解决这个问题的方法是最理想的方法,但在我找到更好的方法之前,它会一直有效。您发布的代码中没有它,但您的问题似乎强烈暗示您正在调用
dealoc
。你唯一应该调用dealloc
的地方是类的dealloc
方法末尾的[super dealloc]
。在super
以外的任何地方调用它都是错误的,并且会导致有关过早释放对象的错误(因为它就是这样做的)
如果这就是你正在做的,我强烈建议你阅读苹果的。它简单而全面地展示了Cocoa中内存管理的工作原理。很抱歉,我要说的是释放而不是解除分配,但问题已经解决了,现在我才意识到我是如何在多个地方释放sprite的。这是一件我会更加关注的事情,因为我已经在这方面摸索了这么长时间使用自动释放,省去了你自己不得不匹配alloc和release的麻烦。。。查看cocos2d如何使用其静态自动释放初始值设定项(例如CCNode中的+(id)节点)