2009-05-24 9 views
3

J'ai quelques UIImageViews qui sont imbriqués dans UIViews, qui les regroupent. Ils sont la propriété d'un contrôleur de vue. Dès que la méthode -viewWillDisappear est appelée, je veux supprimer ces UIImageViews avec leurs UIViews, afin que la mémoire soit libérée.Comment puis-je libérer de la mémoire en toute sécurité en supprimant UIImageViews de l'écran?

J'appelle -release sur les UIViews qui contiennent les UIImageViews en tant que sous-vues. Rien d'autre ne possède les UIImageViews. Tout ce que j'ai est une variable d'instance à l'UIView qui regroupe les UIImageViews ensemble.

Donc quand je m'en écoule -release, le nombre de retain devrait devenir 0. Mais ce n'est pas une garantie que j'ai plus de mémoire libre, non? Donc, j'ai aussi mis myUIView = nil. Est-ce utile/utile? Comment libérer de la mémoire en toute sécurité?

Répondre

3

La meilleure chose à faire dans -viewDidDisappear (pas -viewWillDisappear, vous êtes toujours à l'écran à ce stade) pour ce cas est d'appeler self.view = nil. Cela videra la vue entière du contrôleur de vue, qui sera automatiquement rechargée pour vous la prochaine fois que vous en aurez besoin.

Si vous avez des IBOutlets sur ces vues, vous devez également les définir à zéro, sinon elles ne seront pas libérées. En supposant que vous avez une configuration comme ceci:

@interface MyViewController : UIViewController 
{ 
    UIImageView *_imageView; 
} 
@property (readwrite, retain) IBOutlet UIImageView *imageView; 

@implementation MyViewController 
@synthesize imageView = _imageView; 

Ensuite, vous devez appeler self.imageView = nil dans votre `-viewWillDisappear.

Vous ne devriez généralement pas appeler -release sur vos ivars sauf dans leurs accesseurs et dans -dealloc. La bonne façon de les libérer est de les mettre à zéro en utilisant un accesseur.

Caling -release lorsque retainCount vaut 1, appelez immédiatement free(), ce qui permettra de récupérer de la mémoire. Souvenez-vous, cependant, que d'autres éléments peuvent retenir l'objet, y compris le pool de libération automatique, de sorte que vous ne soyez pas certain du nombre de rétention à un moment donné.

Je conseille vivement aux personnes qui déclenchent une variable de la définir immédiatement à zéro. Cela n'a pas d'impact sur la variable; il vous protège juste de la poursuite d'un pointeur que vous avez libéré et peut maintenant pointer vers la mémoire non allouée. Donc, en -dealloc, j'ai des lignes qui ressemblent à ceci:

[_stuff release]; _stuff = nil; 
[_otherStuff release]; _otherStuff = nil; 
+0

« Ensuite, vous devez appeler self.imageView = nul dans votre' -viewWillDisappear » >>> vous ne vraiment pas le -viewDidDisappear? – Thanks

+0

Désolé; en arrière. Tout ce qui implique l'abandon des vues doit être fait dans viewDidDisappear. Vous devriez attendre jusqu'à ce que vous soyez hors écran pour commencer à laisser tomber les choses. Si vous supprimez des composants de l'interface utilisateur dans viewWillDisappear, votre animation peut être gâchée (puisque vous animez entre viewWillDisappear et viewDidDisappear). –