Iphone 在iOS的UITableViewController中将nil设置为tableView后,viewDidLoad方法再次调用
我正在应用程序中使用UITableViewController。当从tableview控制器向后弹出时,我将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
-(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。当您将表视图控制器从堆栈中弹出时,它及其视图将被解除分配。请查找我更新的编辑。对不起,我打错了。谢谢你的解释。你的猜测是正确的,这里也发生了同样的事情。