2010-04-02 3 views
2

J'ai eu cette erreur de XCode:Pourquoi ai-je des problèmes de mémoire?

objc[8422]: FREED(id): message release sent to freed object=0x3b120c0 

I googlé et trouver ce qui est lié à la mémoire. Mais je ne sais pas quelle ligne de code je vais mal, des idées? Après avoir lancé mon application en simulateur, une deuxième erreur s'affiche, pas d'autre erreur que l'erreur ci-dessus.

@implementation MyAppDelegate 

@synthesize window; 
@synthesize viewController; 


- (void)applicationDidFinishLaunching:(UIApplication *)application {  

    // Override point for customization after app launch  
    [window addSubview:viewController.view]; 
    [window makeKeyAndVisible]; 

    [self changeScene:[MainGameMenuScene class]]; 
} 


- (void)dealloc { 
    [viewController release]; 
    [window release]; 
    [super dealloc]; 
} 

- (void) changeScene: (Class) scene 
{ 
    BOOL animateTransition = true; 

    if(animateTransition){ 
     [UIView beginAnimations:nil context:NULL]; 
     [UIView setAnimationDuration:0.5]; 
     [UIView setAnimationTransition:UIViewAnimationTransitionFlipFromLeft forView:window cache:YES]; //does nothing without this line. 
    } 

    if(viewController.view != nil) { 
     [viewController.view removeFromSuperview]; //remove view from window's subviews. 
     [viewController.view release]; //release gamestate 
    } 

    viewController.view = [[scene alloc] initWithFrame:CGRectMake(0, 0, IPHONE_WIDTH, IPHONE_HEIGHT) andManager:self]; 

     //now set our view as visible 
    [window addSubview:viewController.view]; 
    [window makeKeyAndVisible]; 

    if(animateTransition){ 
     [UIView commitAnimations]; 
    } 
} 

Répondre

3
[viewController.view release]; //release gamestate 

C'est une version supplémentaire (si vous ne l'avez pas alloc, ne relâchez pas). Quelques lignes vers le bas:

viewController.view = [[scene alloc] initWithFrame:CGRectMake(0, 0, IPHONE_WIDTH, IPHONE_HEIGHT) andManager:self]; 

publiera viewController.view à nouveau avant de retenir la nouvelle valeur, qui trop libérer la vue et provoquer un accident (il envoie le message de libération à un objet qui a déjà été dealloc » d/mémoire qui a déjà été libérée). Au lieu de cela, essayez:

scene *view = [[scene alloc] initWithFrame:CGRectMake(0, 0, IPHONE_WIDTH, IPHONE_HEIGHT) andManager:self]; 
viewController.view = view; // setView will release the old/retain the new 
[view release];    // so you don't need to worry about releasing it later 
+0

puis-je conserver à la place controller.view avant removeFromSuperview? – Tattat

+0

ne devrait pas avoir besoin de le conserver ou de le libérer - en particulier si vous êtes sur le point de le remplacer par une nouvelle vue alloc'd. – dstnbrkr

0

A obtenu la solution:

- (void) changeScene: (Class) scene 
{ 
    BOOL animateTransition = true; 

    if(animateTransition){ 
     [UIView beginAnimations:nil context:NULL]; 
     [UIView setAnimationDuration:0.5]; 
     [UIView setAnimationTransition:UIViewAnimationTransitionFlipFromLeft forView:window cache:YES]; //does nothing without this line. 
    } 

    if(viewController.view != nil) { 
     [viewController.view retain]; //retain the view. 
     [viewController.view removeFromSuperview]; //remove view from window's subviews. 
     [viewController.view release]; //release gamestate 
    } 

    viewController.view = [[scene alloc] initWithFrame:CGRectMake(0, 0, IPHONE_WIDTH, IPHONE_HEIGHT) andManager:self]; 

     //now set our view as visible 
    [window addSubview:viewController.view]; 
    [window makeKeyAndVisible]; 

    if(animateTransition){ 
     [UIView commitAnimations]; 
    } 
} 

Il me doit conserver la vue, mais je ne sais pas pourquoi cela est nécessaire.

+0

Ceci est totalement inutile. Vous ne devriez pas publier la vue en premier lieu parce que c'est une propriété d'un autre objet. – TechZen

+0

Mais je peux réutiliser cette méthode pour changer de scène, dois-je continuer ainsi? – Tattat

0

Cette ligne:

[viewController.view release]; 

est plus probable que votre problème. N'envoyez jamais de version à une propriété d'un objet sauf dans la méthode dealloc de la classe. Les contrôleurs de vue voient les accesseurs de propriété géreront la rétention et la libération pour vous.

Questions connexes