我有一个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?感谢。
答案 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]中发布。
不要相信保留计数!