2010-12-08 8 views
0
- (void)loadQuiz:(NSInteger)quizNum { 
    if([self quizViewController] != nil) 
    { 
     [self setQuizViewController:nil]; 
    } 
    QuizViewController *quiz = [[QuizViewController alloc] initWithNibName:@"QuizViewController" bundle:nil]; 
    [quiz setUp:quizNum]; 
    [self setQuizViewController:quiz]; 
    [quiz release]; 

    [[self view] addSubview:[[self quizViewController]view]]; 
    [self setSlide1:[[[self view] subviews] objectAtIndex:0]]; 
    [self setSlide2:[[[self view] subviews] objectAtIndex:1]]; 
    [[self slide1] setHidden:NO]; 
    [[self slide2] setHidden:YES]; 
    [self performTransition]; 
} 

Dans cette méthode, j'ajoute des sous-vues à mon conteneur. Parfois, j'ajoute une image. Parfois, j'ajoute un quiz. Dans une autre fonction qui se déclenche à la fin de l'animation, je supprime toujours la sous-vue au bas de la pile, donc je n'ai jamais plus de 2 sous-vues.Ajout de différents affichages à afficher Gestion de la mémoire et de la mémoire

- (void)animationDidStop:(CAAnimation *)theAnimation finished:(BOOL)flag { 
    [[self model] setTransitioning:NO]; 
    [[[[self view]subviews] objectAtIndex:0] removeFromSuperview]; 
} 

Ma question est: est-ce que j'ai une fuite de mémoire ici? Cela semble fonctionner correctement. Merci d'avance.

Répondre

0

Cela dépend si vous avez défini quizViewController sur retain objets qui lui sont affectés. Si vous le faites, alors vous avez une fuite. Cette partie semble bon:

QuizViewController *quiz = [[QuizViewController alloc] initWithNibName:@"QuizViewController" bundle:nil]; 
[quiz setUp:quizNum]; 
[self setQuizViewController:quiz]; 
[quiz release]; 

Mais ici,

if([self quizViewController] != nil) 
{ 
    [self setQuizViewController:nil]; 
} 

vous configurez simplement le quiz pour nil. Cela signifie que la première fois que vous chargez un quiz, le premier sera perdu dans l'espace de fuite. La chose à faire ici est soit de publier quizViewController, ou, si vous avez besoin de tenir plusieurs quiz, allez-y et déclarez une propriété NSMutableArray pour les contenir tous.

La meilleure façon de vérifier une fuite de mémoire est d'aller dans Xcode et sélectionnez « Exécuter avec l'outil Performance >> Fuites » dans le menu « Exécuter ». Vous obtiendrez une belle liste de tous les objets qui ont fui, avec des traces à l'endroit où la fuite s'est produite. Voici un good tutorial pour vous aider à démarrer.

+0

Merci. En fait [self quizViewController] est une propriété conservée. – intomo

+0

Mais selon docs si j'utilise la méthode setter [self setQuizViewController] la partie cachée de ce setter est qu'il libère avant de conserver la nouvelle référence. Peut-être que je suis un malentendu. Je vais suivre vos conseils et exécuter l'outil Performance. Merci. – intomo

+0

Ah, vous pourriez avoir raison à ce sujet. La réponse est la même, dans tous les cas - pour vérifier les fuites, allez-y et exécutez cet outil. Est-ce que cela répond à votre question? –