Iphone 在iOS的UITableViewController中将nil设置为tableView后,viewDidLoad方法再次调用

Iphone 在iOS的UITableViewController中将nil设置为tableView后,viewDidLoad方法再次调用,iphone,ios,objective-c,xcode,ios6,Iphone,Ios,Objective C,Xcode,Ios6,我正在应用程序中使用UITableViewController。当从tableview控制器向后弹出时,我将nil设置为tableview以从内存中释放视图控制器。它再次调用viewDidLoad,请解释为什么会发生这种情况 -(void)handleBackButton{ self.tableView=nil; [self.navigationController popViewControllerAnimated:YES]; } 您可以在viewDidLoa

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

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

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

但我可以做出有根据的猜测。当您告诉导航控制器弹出视图控制器时,它需要在屏幕外设置该视图控制器的
视图的动画。为此,它可能会要求消失视图控制器提供其
视图

UITableViewController
视图
与其
表视图
相同。当您将
tableView
设置为
nil
时,您还将
view
设置为
nil
。因此,当导航控制器向表视图控制器询问其
视图
(以便在屏幕外设置视图动画)时,表视图控制器会注意到其
视图
为零,因此加载其视图。要加载它的视图,它发送自己
loadView
,然后发送自己
viewDidLoad

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

无论如何,如果确实要删除视图控制器的视图,请不要将其
视图
设置为
nil
,而视图可能仍在屏幕视图层次结构中。等到视图确实超出层次结构。例如,子类
UITableViewController
,并重写
didMoveToParentViewController:
,如下所示:

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

什么?向我们展示一些allI am重写UINavigationController的后退按钮事件的代码,并在该方法中设置self.tableView=nil。那时它正在发生。没有代码就很难帮助你。有一件事:当您设置self.tableView=nil时,您是在释放表视图,而不是表视图控制器。无需将表视图设置为nil。当您将表视图控制器从堆栈中弹出时,它及其视图将被解除分配。请查找我更新的编辑。对不起,我打错了。谢谢你的解释。你的猜测是正确的,这里也发生了同样的事情。