UINavigationController和UIViewController如何工作?

时间:2012-03-11 15:38:14

标签: objective-c ios uiviewcontroller uinavigationcontroller

我正在了解UINavigationControllerUIViewController s。这是我构建的简单应用程序。请注意,我使用ARC。

我的应用有一个导航控制器和两个视图控制器(我们称之为FirstViewControllerSecondViewController)。当应用程序启动时,导航控制器将FirstViewController推送到堆栈上。

FirstViewController中,我有一个按钮,可以在触摸时按下SecondViewController。这是一些代码。

FirstViewController.m

-(IBAction)pushSecondViewController
{
    SecondViewController *secondViewController = [SecondViewController alloc]init];
    [self.navigationController pushViewController:secondViewController animated:YES];
}

在第二个视图控制器中,我有一个按钮,可以从堆栈中弹出当前视图控制器。

SecondViewController.m

-(IBAction)popViewController
{
    [self.navigationController popViewControllerAnimated:YES];
}

到目前为止,这么好。以下是我的问题:

navigationController是否检查SecondNavigationController的现有实例,如果不存在则会创建一个新实例?

如果没有,我是否应该使用单例来确保每次触摸推动SeconViewController的按钮时,只创建并重用一个实例而不是创建新实例?

2 个答案:

答案 0 :(得分:4)

使用当前代码,第二个视图控制器在从堆栈中弹出时将被销毁,所以不会,导航控制器不会重复使用它。

如果你真的想要保留第二个视图控制器,使它成为第一个视图控制器的强大属性,但除非你真的有理由,否则不要这样做 - 你正在使用的方法是标准的并且创建一个新视图控制器通常优先占用大量内存,而视图控制器甚至不在屏幕上。内存比处理器资源更稀缺,创建视图控制器一直在发生。

答案 1 :(得分:1)

我同意 jrturton ,并添加了以下指南。

首先,在我看来,将控制器作为单身人士并不是一个好主意。

然后,您必须检查自己UINavigationController" controllers数组"中是否存在某种类型的实例。

@property(nonatomic, copy) NSArray *viewControllers

最后,您可以为您的控制器创建一个强大的参考,但它根本不需要。它很快就能创建一个新的控制器。如果有的话,我会缓存上面显示的数据,而不是强烈引用它。这样可以避免用户等待已下载的数据。

希望它有所帮助。