2010-08-19 5 views
2

de question fondamentale sur la gestion de la mémoire iPhone:gestion de la mémoire iphone (de base)

que j'ai un viewController avec plusieurs sous-vues aussi contrôlées par viewControllers. Lorsque je supprime le viewController supérieur et libère l'instance - ce qui arrive à ses enfants? Y a-t-il aussi tous les objets contenus dans ce document? Lorsque je lance mon application dans des instruments, je ne reçois aucune fuite de mémoire. Mais la valeur de «toutes les allocations» augmente-t-elle? (Je suppose que cette valeur est la mémoire globale consommée par mon application?)

Répondre

1

Les contrôleurs de vue libèrent leur vue sur dealloc. Les vues libèrent leurs sous-vues sur dealloc. Une version n'est pas un dealloc.

Qu'est-ce qui retient les autres contrôleurs de vue? Si votre contrôleur de vue est, votre contrôleur de vue doit les libérer. Habituellement, ce sera une propriété, donc vous pouvez faire self.subViewController = nil.

De plus, si vous avez des IBOutlets (et j'espère vraiment que vous utilisez des propriétés pour celles-ci), vous devrez également les mettre à zéro dans dealloc.

Libérez ce que vous possédez.

+0

cela me laisse un peu confus. Lorsque je supprime une vue d'une vue en utilisant [self.view remove from superview], les propriétés de cette vue sont-elles supprimées de la mémoire ou sont-elles toujours présentes? Dois-je définir les propriétés sur zéro avant de les libérer? On dirait que je ne fais pas la différence entre un objet libéré et un objet qui a été libéré ... – Swissdude

+0

Si plus d'une chose a conservé un objet, alors la libération ne libérera pas l'objet. Ce n'est que lorsque le nombre de retards tombe en dessous de celui que le dealloc est réellement fait. –

+0

@Urs Il est également important de noter que [self.view removeFromSuperview] décrémentera le nombre de références sur la propriété view de votre UIViewController, mais cela n'affectera pas le nombre de références sur le UIViewController lui-même. – RedBlueThing

1

Cela dépend où votre enfant UIViewControllers sont référencés. Si elles ne sont référencées que dans le contrôleur de vue racine (conservées lorsqu'elles sont créées et publiées sur dealloc), elles seront libérées lorsqu'elles seront désallouées. Si vous avez d'autres références à ces contrôleurs de vue (de votre délégué d'application peut-être?), Elles ne seront publiées que lorsque ces références seront publiées.

Cocoa touch NSObjects sont référencés comptés, ils sont libérés lorsque leur retainCount est décrémenté à zéro. Le retainCount est décrémenté chaque fois que release est appelée sur un objet.