3 votes

Correctement libérer ViewController lors de l'ajout de subview sans navigationController

Un problème auquel je suis souvent confronté est de ne pas pouvoir créer et détruire correctement un ViewController lors de l'ajout de la vue du ViewController en tant que sous-vue, sans utiliser un contrôleur de navigation.

par exemple:

MyViewController *myViewController = [[MyViewController alloc] init];  
[currentView addSubView:myViewController.view];  
[myViewController release];

Cela fonctionne très bien s'il s'agit d'une vue sans contrôleur et qu'il n'y a pas d'UIControls avec lesquels l'utilisateur doit interagir. Cependant, envoyer des messages au contrôleur de vue de cette vue provoque une EXEC_BAD_ACCESS car ils ne sont plus en mémoire.

MyViewController *myViewController = [[MyViewController alloc] init];  
[currentView addSubView:myViewController.view]; 

Cela fonctionne lors de l'envoi de messages, cependant c'est une fuite de mémoire et est détecté par l'analyseur statique.

Le définir en tant que propriété du contrôleur de vue actuel fonctionne parfois. Mais si je dois en créer un tas avec un nombre inconnu de MyViewControllers et les ajouter à quelque chose comme un UIScrollView, cela ne fonctionne pas non plus.

for (int i = 0; i < [myViewControllers count]; i++) {  
    MyViewController *myTmpViewController = [[MyViewController alloc] init];
    [myCurrentUIScrollView addSubview:myTmpViewController.view];
    [myTmpViewController release];
}

Cela va quand même planter si myTmpViewController a une interaction utilisateur ou quelque chose de similaire. Comment ajouter ceci et le libérer correctement?

1voto

pt2ph8 Points 4898

Vous pourriez stocker un pointeur vers le contrôleur de vue dans une propriété ivar et le libérer dans votre méthode dealloc.

1voto

seppo0010 Points 3758

Vous pouvez avoir un NSMutableArray et ajouter les contrôleurs là.

for (int i = 0; i < [myViewControllers count]; i++) {  
    MyViewController *myTmpViewController = [[MyViewController alloc] init];
    [myCurrentUIScrollView addSubview:myTmpViewController.view];
    [myControllers addObject:myTmpViewController];
    [myTmpViewController release];
}

// ..

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

0voto

Kris Van Bael Points 2228

Si une sous-vue a des besoins de contrôle limités, vous pouvez envisager de sous-classer à partir de UIView et de permettre à la vue de se contrôler elle-même (par exemple, être son propre délégué)

Sinon, vous devez décider qui est le propriétaire le plus logique de ces viewcontrollers (souvent le viewcontroller de la vue parent) et en faire des ivars de leur propriétaire.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X