2009-10-17 7 views
1

Je travaille sur ma première application et j'ai quelques questions sur la gestion de la mémoire.Quelques questions sur la gestion de la mémoire iphone et cocos2d

Première question:

Je travaille sur une scène d'intro qui ressemble à ceci

#import "Intro_Scene.h" 
#import "Main_Menu.h" 
#import "Label.h" 


@implementation Intro_Scene 
@synthesize logo,label; 

-(id) init 
{ 
self = [super init]; 

if(self != nil) 
{ 
    //Load logo image and set position 
    logo = [Sprite spriteWithFile:@"AVlogo_1.png"]; 
    logo.position = ccp(-50, 0); 
    logo.scale = 1.8f; 
    [self addChild: logo]; 

    //Creates 3 actions for the logo sprite 
    id action0 = [MoveTo actionWithDuration:0 position:ccp(160,270)]; 
    id action1 = [FadeIn actionWithDuration:3]; 
    id action2 = [FadeOut actionWithDuration:3]; 

    //Logo runs the actions 
    [logo runAction: [Sequence actions:action0,action1, action2, nil]]; 

    //Schedules the changeScene method to switch scenes to main menu within 6 seconds of loading. 
    [self schedule: @selector(changeScene) interval:6.0f]; 

    //Creates a label and positions it, Alternative Visuals 
    label = [Label labelWithString:@"Alternative Visuals" fontName:@"Verdana" fontSize:22]; 
    label.position = ccp(160, 120); 
    [self addChild:label]; 

} 

return self; 
} 

//Method called after intro has run its actions, after 6 seconds it switches scenes. 
-(void)changeScene 
{ 
[self removeChild:logo cleanup:YES]; 
[self removeChild:label cleanup:YES]; 

Main_Menu *mainMenu = [Main_Menu node]; 
[[Director sharedDirector] replaceScene: mainMenu]; 
} 

-(void)dealloc 
{ 
[[TextureMgr sharedTextureMgr] removeUnusedTextures]; 
[label release]; 
[logo release]; 
[super dealloc]; 
} 
@end 

Ai-je sorti tout correctement, et les fuites évitées? Je l'ai couru dans des instruments plusieurs fois et il n'a trouvé aucune fuite et utilisé environ 2 Mo de mémoire, est-ce beaucoup ou le montant à attendre? Est-ce que la méthode dealloc est également appelée quand la scène est remplacée?

Question 2:

Mon menu principal est configuré comme celui-ci

#import "Main_Menu.h" 
#import "Sprite.h" 
#import "cocos2d.h" 

@implementation Main_Menu 
@synthesize background, controlLayer; 
-(id) init 
{ 
self = [super init]; 
if(self != nil) 
{ 
//Create the default background for main menu not including directional pad and highlight box 
background = [Sprite spriteWithFile:@"Main_Menu_bg.png"]; 
background.position = ccp(160,240); 
[self addChild:background]; 

    //Adds the control later class to the main menu, control layer class displays and controls the directional pad and selector. 
    ControlLayer *layer = [[ControlLayer alloc] init]; 
    self.controlLayer = layer; 
    [layer release]; 
    [self addChild: controlLayer]; 
} 

return self; 
} 

-(void) dealloc 
{ 
    [seld removeChild:background cleanup:YES]; 
    [[TextureMgr sharedTextureMgr] removeUnusedTextures]; 
[background release]; 
[controlLayer release]; 
[super dealloc]; 
} 


@end 

Encore une fois que je fais tout correctement? Le calque ControlLayer que j'ajoute à cette scène contient un sprite de pavé directionnel que l'utilisateur utilise pour naviguer dans le menu. Dans les instruments Il confirme également qu'il n'y a pas de fuites de mémoire, et il utilise 4,79 Mo de mémoire. Encore une fois, est-ce un montant raisonnable? Je vais très probablement utiliser AtlasSprite et AtlastSpriteManager pour économiser de la mémoire. Je suis nouveau à cocos2d, donc si vous voyez que je fais quelque chose de mal, signalez-le! Je préférerais corriger les mauvaises habitudes dans les premiers stades. Et si vous avez d'autres conseils pour la gestion de la mémoire, partagez.

Répondre

3

Ne pas libérer le logo, l'étiquette ou l'arrière-plan. Vous n'avez pas alloué/copié/nouveau/conservé, donc vous ne les possédez pas et ne devez pas les libérer.

Je suppose que la propriété controllerLayer a l'attribut retain? Sinon, vous avez probablement l'intention de le faire.

En général, je suggère deux choses à l'avenir.

  1. Lire et comprendre le Cocoa Memory Management Fundamentals
  2. Exécutez le Clang analyzer sur votre code. Ceci est disponible dans Xcode 3.2 via Build-> Build and Analyze. Cela aidera à détecter ces problèmes de mémoire.

Consultez également this SO question.