0

我在我的应用程序中使用 UITableViewController。当从 tableview 控制器弹出到 back 时,我将 nil 设置为 table view 以从内存中释放视图控制器。它再次调用 viewDidLoad,请解释一下为什么会这样。

-(void)handleBackButton{
        self.tableView=nil;
        [self.navigationController popViewControllerAnimated:YES];
}
4

1 回答 1

1

您可以在其中设置断点viewDidLoad并查看堆栈跟踪以了解它为什么要重新加载其视图。

但我可以做出有根据的猜测。当你告诉导航控制器弹出一个视图控制器时,它需要动画那个视图控制器view离开屏幕。为此,它可能会向消失的视图控制器询问其view.

AUITableViewController的和view它的一样tableView。当您设置tableView为 时nil,您也设置viewnil。因此,当导航控制器向表视图控制器询问它view(以便它可以在屏幕上为视图设置动画)时,表视图控制器注意到它view是 nil,所以它加载它的视图。为了加载它的视图,它先发送自己loadView,然后发送自己viewDidLoad

我不知道您为什么真的会费心尝试卸载视图。如果视图控制器本身被释放,它将释放它的视图(这将释放视图,除非您将它保留在其他地方)。如果视图控制器没有被释放,这通常不是因为您可能希望尽快将其视图放回屏幕上吗?

无论如何,如果您真的想摆脱视图控制器的视图,请不要将其设置为viewnil而该视图可能仍在屏幕视图层次结构中。等到视图绝对超出层次结构。例如,子类UITableViewController和覆盖didMoveToParentViewController:是这样的:

- (void)didMoveToParentViewController:(UIViewController *)parentViewController {
    [super didMoveToParentViewController:parentViewController];
    if (parentViewController == nil) {
        self.tableView = nil;
    }
}
于 2013-08-08T06:56:41.513 回答