viewDidLoad 方法在 iOS 中的 UITableViewController 中将 nil 设置为 tabl



我在我的应用程序中使用UITableViewController。从表视图控制器弹出到后面时,我将 nil 设置为表视图以从内存中释放视图控制器。它再次调用视图DidLoad,请解释我为什么会发生这种情况。

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

您可以在viewDidLoad中设置断点,并查看堆栈跟踪以了解它重新加载其视图的原因。

但我可以做出一个有根据的猜测。 当您告诉导航控制器弹出视图控制器时,它需要将该视图控制器的view动画化。 为此,它可能会要求消失的视图控制器提供其view

UITableViewControllerview与其tableView相同。 将tableView设置为 nil 时,还将view设置为 nil 。 因此,当导航控制器向表视图控制器询问其view(以便它可以对屏幕外的视图进行动画处理(时,表视图控制器会注意到其view为 nil,因此它会加载其视图。 为了加载它的视图,它会向自己发送loadView然后向自己发送viewDidLoad

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

无论如何,如果您确实想摆脱视图控制器的视图,请不要将其view设置为 nil,因为视图可能仍在屏幕上的视图层次结构中。 等到视图肯定不在层次结构中。 例如,子类UITableViewController ,并覆盖didMoveToParentViewController:如下所示:

- (void)didMoveToParentViewController:(UIViewController *)parentViewController {
    [super didMoveToParentViewController:parentViewController];
    if (parentViewController == nil) {
        self.tableView = nil;
    }
}

最新更新