2009-12-29 5 views
0

Dans une application basée sur la vue, j'affiche une vue et une fois que l'utilisateur a terminé cette vue, l'utilisateur clique sur Terminé et la vue est supprimée. Cependant, cela ne dérange pas la vue, ce que je veux faire. Quelle est la bonne façon de libérer ce type de vue?Désallocation correcte d'une vue

Actuellement, je suis hors de la deuxième vue avant qu'il ne soit appelé. Cela semble fonctionner et la deuxième vue est réinitialisée. Cependant, n'est-il pas plus approprié pour la seconde vue de se détruire (elle-même après removeFromSuperview)?

En première vue:

//show next view 
aView = nil; 
if(aView == nil) 
{ 
    aView = [[AView alloc] initWithNibName:@"aView" bundle:nil]; 
} 
[self.view addSubview: aView.view]; 

Cliquez sur Terminé dans aView

[self.view removeFromSuperview]; 

Répondre

1

La méthode removeFromSuperview libère automatiquement "aView.view", vous ne devez donc pas libérer aView dans le premier contrôleur de vue. Je pense que vous avez déclaré AView *aView dans le fichier principal, mais vous n'avez pas besoin de le faire. Vous pouvez déclarer la aView comme une variable locale comme celui-ci:

// go to second view 
SecViewController *sec = [[SecViewController alloc] initWithNibName:@"SecView" bundle:nil]; 
[self.view addSubview:sec.view]; 

// go back 
[self.view removeFromSuperview]; 
+0

Merci. J'ai enlevé la déclaration de fichier d'en-tête et cela fonctionne très bien. – 4thSpace

1

Immédiatement après

[self.view addSubview: aView.view]; 

Vous devez ajouter:

[aView release]; 

Votre sous-vue a été conservée par la vue de votre contrôleur de vue, ce qui peut être le cas.

+0

Cela ne fonctionne pas. J'ai une connexion IBAction à un bouton dans aView. Quand je clique dessus, j'obtiens immédiatement EXC_BAD_ACCESS. Les points d'arrêt dans le bouton ne sont jamais touchés. – 4thSpace

0

les deux réponses ci-dessus sont la théorie correcte de la façon dont vous devriez gérer la mémoire dans l'objectif c.

selon la documentation dev:

http://developer.apple.com/iPhone/library/documentation/UIKit/Reference/UIView_Class/UIView/UIView.html#//apple_ref/occ/instm/UIView/removeFromSuperview

callling removeFromSuperview appellera effectivement la libération pour vous, si vous êtes d'accord, je pense.

+0

Non - il ne se libère pas pour vous. Le dealloc de la vue enfant n'est jamais appelé. Plutôt que de voir, je devrais dire viewcontroller. – 4thSpace

1

Si vous définissez précédemment votre viewController d'abord le statut de répondeur (comme pour répondre aux événements de mouvement), la chaîne de répondeur conservera le contrôleur. Vous devez démissionner du premier répondant pour détruire complètement le contrôleur.

[self resignFirstResponder]; 
[self.view removeFromSuperview]; 
Questions connexes