代码之家  ›  专栏  ›  技术社区  ›  RunLoop

正确释放直接添加到uiviewcontroller的uitableviewcontroller和uitableview

  •  1
  • RunLoop  · 技术社区  · 15 年前

    我有一个uiviewcontroller(parentvc),我在其中添加了一个uitableviewcontroller,如下所示(它不会被推送,因为TableView只占屏幕的一半):

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

    在Dealloc,我补充道 [tableVC release];

    使用仪器,我可以看到当parentvc释放时,tablevc确实完全释放了,这很好,但我不知道为什么我认为tablevc的uiTableView的保留计数为2(1表示tablevc保留,1表示parentvc保留)。我的直觉是需要额外的[tablevc.tableview版本],但是添加它会使应用程序崩溃。为什么当前代码正确地释放了tablevc(如果确实是这样的话)?UITableViewController是否未保留其TableView?谢谢。

    2 回复  |  直到 15 年前
        1
  •  1
  •   drawnonward    15 年前

    您正在分配tablevc,因此保留计数为1。您不会将tablevc传递给任何其他对象,因此没有任何其他原因会保留它。如果其他东西确实保留了tablevc,它将负责在不再需要它时释放它。

    如果要查看Tablevc拥有的UITableView的保留计数,它可能会高于一个,因为它由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,则应释放结果。

        2
  •  0
  •   gnasher    15 年前

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

    在这种情况下,tablevc将在“dealloc”中释放,它控制的视图将在[super dealloc]中释放。

    不要相信保留计数!