Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/41.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone NSMutableArray和内存释放_Iphone_Objective C_Cocos2d Iphone - Fatal编程技术网

Iphone NSMutableArray和内存释放

Iphone 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

我正在用cocos2d为iphone制作一个应用程序,我正在试图找出同时从NSmutableArray和层中删除项目的最佳方法。 我的意思是,数组中的对象继承自ccNode,并包含我作为子对象添加到cclayer的ccsprite。下面的代码位于一个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本身删除了sprite dealloc,并将其添加到其上方的cclayer中。这已经停止了碰撞,所以我想我的问题是对的。当然,我不认为我解决这个问题的方法是最理想的方法,但在我找到更好的方法之前,它会一直有效。

您发布的代码中没有它,但您的问题似乎强烈暗示您正在调用
dealoc
。你唯一应该调用
dealloc
的地方是类的
dealloc
方法末尾的
[super dealloc]
。在
super
以外的任何地方调用它都是错误的,并且会导致有关过早释放对象的错误(因为它就是这样做的)


如果这就是你正在做的,我强烈建议你阅读苹果的。它简单而全面地展示了Cocoa中内存管理的工作原理。

很抱歉,我要说的是释放而不是解除分配,但问题已经解决了,现在我才意识到我是如何在多个地方释放sprite的。这是一件我会更加关注的事情,因为我已经在这方面摸索了这么长时间使用自动释放,省去了你自己不得不匹配alloc和release的麻烦。。。查看cocos2d如何使用其静态自动释放初始值设定项(例如CCNode中的+(id)节点)