2010-08-28 5 views
0

Je fais une application pour l'iphone en utilisant cocos2d et j'essaie de trouver la meilleure approche pour enlever des éléments d'un NSmutableArray et de la couche en même temps. Ce que je veux dire par là, c'est que les objets dans le tableau héritent de ccNode et contiennent un ccsprite que j'ai ajouté en tant qu'enfant à la cclayer. Le code ci-dessous est dans un cclayer qui a le nsmutablearray appelé bonusicons.NSMutableArray et la mémoire 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]; 


} 

Cela semble faire ce que je veux pour ajouter les objets sprite à l'écran et en ajoutant les objets au NSMutableArray. Maintenant, bien sûr, ce n'est probablement pas la bonne façon de le faire, alors criez-moi si ce n'est pas le cas! Ensuite, j'essaie de supprimer les objets du tableau et de l'écran. Je peux les supprimer du tableau avec aucun problème, je viens de faire ce qui suit

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


    [bonusIcons removeObjectAtIndex:i]; 

} 

Bien sûr, cela laisse les sprites à l'écran. Alors, comment puis-je approcher ce que je suis en train de faire pour que je puisse supprimer à la fois les sprites de l'écran et les objets du tableau auquel le sprite est associé. Je peux supprimer les sprites de l'écran en utilisant les balises et en tapant

[self removeChildByTag: i nettoyage: YES]; mais alors j'obtiens des erreurs en essayant de retirer des éléments du tableau. Je suppose parce que j'ai déjà supprimé une partie de l'objet et le dealloc du ccnode ne peut plus trouver le sprite à libérer? donc tout pointeur/conseils etc de la façon dont je devrais faire cela serait très apprécié. J'ai lu un tas de choses sur la gestion de la mémoire qui, je crois, est mon problème actuel, mais je ne semble tout simplement pas le faire correctement. : merci à tous

éditer: ok depuis la publication de ceci j'ai enlevé le dealloc de sprite du ccnode lui-même et l'ai ajouté au cclayer au-dessus de lui. Cela a arrêté le crash, donc je suppose que j'avais raison avec le problème que j'avais. Bien sûr, je ne pense pas que la façon dont je l'ai résolu est la manière la plus idéale, mais ça ira jusqu'à ce que je trouve un meilleur moyen.

+0

utilisez autorelease et vous épargner le problème d'avoir à faire correspondre allouer avec libération ... voir comment cocos2d le fait avec leurs initialiseurs autorelease statique (par exemple + (ID) noeud dans CCNode) – LearnCocos2D

Répondre

1

Vous ne l'avez pas dans le code que vous avez posté, mais votre question semble impliquer fortement que vous appelez dealloc. Le seul endroit que vous devriez appeler dealloc est [super dealloc] à la fin de la méthode dealloc. L'appeler sur n'importe quoi mais super ou dans n'importe quel autre endroit est faux et mènera à des erreurs au sujet des objets libérés prématurément (parce que, bien, c'est ce qu'il fait).

Si c'est ce que vous faites, je vous suggère fortement de lire le memory management guide d'Apple. Il explique comment la gestion de la mémoire fonctionne parfaitement dans Cocoa.

+0

désolé de dire libération non dealloc – glogic

+0

mais le problème a été résolu maintenant je viens de réaliser comment je libérais le sprite dans plusieurs endroits. il est quelque chose de mal faire attention à plus maintenant que j'ai fouillé autour de cela depuis si longtemps – glogic

Questions connexes