2010-05-21 5 views
1

J'ai un UIViewController (parentVC) auquel ajouter une UITableViewController comme suit (il n'est pas poussé depuis le tableview occupe seulement la moitié de l'écran):correctement libérant UITableViewController et UITableView ajouté directement à un UIViewController

tableVC = [[SmallTableVC alloc] initWithStyle:UITableViewStylePlain]; 
      [self.view addSubview:tableVC.tableView]; 

En dealloc, ajouter [tableVC release];

instruments à l'aide, je peux voir que le tableVC est en effet entièrement libéré lorsqu'il est libéré parentVC, ce qui est bon, mais je ne sais pas pourquoi que je pensais que le UITableView de tableVC aurait retain compte de 2 (1 pour la rétention par tableVC et 1 pour la rétention par parentVC). Mon intuition était qu'une version additionnelle [tableVC.tableView] serait nécessaire, mais l'ajouter bloquait l'application. Pourquoi tableVC est-elle libérée correctement par le code actuel (si c'est effectivement le cas)? Est-ce qu'un UITableViewController ne conserve pas sa tableView? Merci.

+0

Vous vers le bas ont voté ma réponse et a déclaré: « Je ne parle jamais retenir chefs d'accusation et je ne ai jamais demandé la libération de tableVC » indiquant votre question: « Utilisation d'instruments, je peux voir que le tableVC est en effet entièrement libérée lorsque parentVC libéré, ce qui est bon, mais je ne sais pas pourquoi, car je pensais que le UITableView de tableVC aurait un nombre de retenue de 2 (1 pour la rétention par tableVC et 1 pour la rétention par parentVC). " Ce qui donne? – gnasher

+0

Je suis désolé, dans mon esprit la question était sur la sortie de la tableview, mais il semble que j'aurais dû le formuler mieux. SO ne me laisse pas changer le vote à moins que votre réponse ne soit éditée. Donc, si vous faites un petit montage, je vais le voter. – RunLoop

Répondre

1

Vous allouez tableVC, donc retenez count est 1. Vous ne passez pas tableVC à autre chose, il n'y a donc aucune raison que rien d'autre ne le conserve. Si quelque chose d'autre conservait tableVC, il serait responsable de le libérer quand il n'en aurait plus besoin. Si vous observez le nombre de retenues de UITableView détenues par tableVC, il peut être supérieur à un, car il est conservé à la fois par tableVC et, après avoir appelé addSubview, par la vue détenue par parentVC.

Edit:

Si vous voulez nettoyer de force jusqu'à tableVC.tableView puis appelez removeFromSuperview avant de relâcher tableVC. Je crois que les contrôleurs de vue le font implicitement lorsqu'ils sont libérés, mais cela ne fait pas de mal de le faire manuellement aussi.

Après avoir appelé [self.view addSubview:tableVC.tableView] tableVC.tableView aura un nombre de retenues d'au moins deux. Un pour la hiérarchie des vues et un pour la tableVC. Lorsque vous libérez tableVC, il supprime la tableView de la hiérarchie de vue qui libère tableView, puis libère tableView lui-même. Même s'il ne supprimait pas tableView de la hiérarchie de vue, parentVC.view est sur le point d'être supprimé et libère la hiérarchie de vues qui incluait tableVC.tableView.

Libérez uniquement ce que vous avez explicitement conservé. Les conventions de nommage rendent cela assez clair. Si le nom inclut retain, new, alloc ou copy alors vous devriez publier le résultat.

0

Faites attention à compter confiance sur iPhone. L'iPhone ne fait pas de vrai garbage collection et donc ces valeurs devraient être ignorées. Suivez les règles de gestion de la mémoire et tout ira bien.

Dans ce cas, la tableVC sera libérée dans "dealloc" et la vue contrôlée sera libérée dans [super dealloc].

Ne faites pas confiance à compter!

+0

Je n'ai jamais mentionné les comptes de retenue et je n'ai jamais posé de questions sur la sortie de tableVC – RunLoop

Questions connexes