正确释放UITableViewController和UITableView直接添加到UIViewController

时间:2010-05-21 06:14:16

标签: iphone cocoa-touch

我有一个UIViewController(parentVC),我按如下方式添加了一个UITableViewController(因为tableview只占用了大约一半的屏幕而没有推送它):

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

在dealloc中,我添加了[tableVC release];

使用工具,我可以看到tableVC确实在parentVC发布时完全释放,这很好,但我不知道为什么因为我认为tableVC的UITableView的保留计数为2(保留时为1) tableVC和1由parentVC保留)。我的直觉是需要额外的[tableVC.tableView发布],但添加它会使应用程序崩溃。为什么tableVC通过当前代码正确发布(如果确实是这样)? UITableViewController是否不保留其tableView?感谢。

2 个答案:

答案 0 :(得分:1)

您正在分配tableVC,因此保留计数为1.您不会将tableVC传递给任何其他内容,因此没有任何理由可以保留它。如果其他东西确实保留了tableVC,它将负责在不再需要它时释放它。

如果要查看tableVC所拥有的UITableView的保留计数,它可能会高于1,因为tableVC和调用addSubview后,parentVC拥有的视图都会保留它。

编辑:

如果要强制清理tableVC.tableView,请在释放tableVC之前调用removeFromSuperview。我相信视图控制器在发布时会隐式执行此操作,但手动操作也没有什么坏处。

调用[self.view addSubview:tableVC.tableView] tableVC.tableView后,保留计数至少为2。一个用于视图层次结构,一个用于tableVC。当你释放tableVC时,它会从释放tableView的视图层次结构中删除tableView,然后释放tableView本身。即使它没有从视图层次结构中删除tableView,parentVC.view也将被拆除并释放包含tableVC.tableView的视图层次结构。

仅发布您明确保留的内容。命名约定使这一点非常清楚。如果名称包括retain,new,alloc或copy,那么您应该释放结果。

答案 1 :(得分:0)

小心相信iPhone上的保留计数。 iPhone不进行真正的垃圾收集,因此应忽略这些值。遵循内存管理规则,你会没事的。

在这种情况下,tableVC将以“dealloc”发布,它控制的视图将在[super dealloc]中发布。

不要相信保留计数!