我在我的应用程序中使用UITableViewController。从表视图控制器弹出到后面时,我将 nil 设置为表视图以从内存中释放视图控制器。它再次调用视图DidLoad,请解释我为什么会发生这种情况。
-(void)handleBackButton{
self.tableView=nil;
[self.navigationController popViewControllerAnimated:YES];
}
您可以在viewDidLoad
中设置断点,并查看堆栈跟踪以了解它重新加载其视图的原因。
但我可以做出一个有根据的猜测。 当您告诉导航控制器弹出视图控制器时,它需要将该视图控制器的view
动画化。 为此,它可能会要求消失的视图控制器提供其view
。
UITableViewController
的view
与其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;
}
}