0

Je suis assez nouveau en programmation pour iOS, et je rencontre un problème avec une application iPad que je développe. J'utilise un contrôleur splitview pour ajouter une sous-vue à la vue détaillée de splitview chaque fois qu'une cellule dans la vue racine de splitview est tapée. C'est bien jusqu'à ce que la pile devienne trop haute et que je manque de mémoire. Comment puis-je libérer la sous-vue précédente après l'ajout de la nouvelle vue à la pile? Ou y a-t-il une meilleure façon de résoudre ce problème?Publier des sous-vues

Merci

Répondre

0

Pour supprimer une vue de son superview:

[view removeFromSuperview]; 

Le superview libérera la vue à ce moment-là. Donc, si l'aperçu est le seul acteur avec une référence propriétaire, la vue sera désallouée. En d'autres termes, ceci:

[superview addSubview:view]; 

provoque la superview de conserver la vue. Donc, vous voyez souvent des blocs de code comme:

view = [[ViewClass alloc] initWithFrame:frame]; // I own view 

[superview addSubview:view];     // superview and I both own view 

[view release];         // now only superview owns view; 
               // it'll be deallocated if 
               // superview ever relinquishes 
               // ownership 

Vous avez maintenant un pointeur pour voir qui est valable aussi longtemps que la vue reste dans le superview. Il est donc sûr de poster removeFromSuperview, mais après cela, l'utilisation de la vue est explicitement dangereuse. L'objet de vue ne vivra qu'entre alloc/init et removeFromSuperview. Il sera libéré après avoir été retiré.

par des règles normales de comptage de référence de cacao, ce qui suit est à peu près la même que celle d'une solution de remplacement pour un alloc/init et une version ultérieure:

view = [ViewClass viewWithFrame:frame]; // view is an autoreleased object; 
             // the autorelease pool owns it 

[superview addSubview:view];    // superview now owns view also 

// the autorelease pool will relinquish ownership automatically, in the future... 

Si vous ne l'avez pas fait quoi que ce soit manuellement affectent le comportement, étant juste dans le cycle de fonctionnement normal, alors les choses dans le pool autorelease sont sans danger pour la vie de la pile d'appels en cours. Dans ce cas, vous traiteriez la vue exactement comme vous l'avez fait dans l'exemple manuel alloc/init, en ayant peut-être fait le changement juste pour sauvegarder une ligne de code et laisser la gestion de la mémoire implicite.