我在我的应用程序中使用 UITableViewController。当从 tableview 控制器弹出到 back 时,我将 nil 设置为 table view 以从内存中释放视图控制器。它再次调用 viewDidLoad,请解释一下为什么会这样。
-(void)handleBackButton{
self.tableView=nil;
[self.navigationController popViewControllerAnimated:YES];
}
我在我的应用程序中使用 UITableViewController。当从 tableview 控制器弹出到 back 时,我将 nil 设置为 table view 以从内存中释放视图控制器。它再次调用 viewDidLoad,请解释一下为什么会这样。
-(void)handleBackButton{
self.tableView=nil;
[self.navigationController popViewControllerAnimated:YES];
}
您可以在其中设置断点viewDidLoad
并查看堆栈跟踪以了解它为什么要重新加载其视图。
但我可以做出有根据的猜测。当你告诉导航控制器弹出一个视图控制器时,它需要动画那个视图控制器view
离开屏幕。为此,它可能会向消失的视图控制器询问其view
.
AUITableViewController
的和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;
}
}