UINavigationController和UIViewController如何工作?

问题描述:

我正在学习UINavigationControllerUIViewController s。这是我构建的简单应用程序。请注意,我使用ARC。UINavigationController和UIViewController如何工作?

我的应用程序有一个导航控制器和两个视图控制器(让我们称之为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现有实例,如果这样的存在,那么它会创建一个新的?

如果没有,我应该使用singleton来确保只有一个实例被创建并重用,而不是每次触摸按下按钮时都会创建一个新实例?

以您目前的代码,当其从堆栈中弹出第二视图控制器会被破坏,所以没有,导航控制器不会重新使用它。

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

+0

不,我不想保留第二个视图控制器。我很好奇导航控制器如何工作。 感谢您的解释! – ihodo 2012-03-11 16:00:51

+0

为了不开始一个新的话题。如果我的应用程序包含四个视图控制器,则第一个和第二个视图控制器仅在应用程序中使用一次。 我应该从导航控制器中弹出它们([self.navigationController popViewControllerAnimated:YES])以便不使用内存吗? – ihodo 2012-03-11 16:08:47

+0

不,只能使用推动和弹出来上下移动导航堆栈。 – jrturton 2012-03-11 17:26:18

我同意jrturton,我添加了以下原则。

首先,在我看来,把控制器设置为单身并不是一个好主意。

然后,你如果一些类型的实例的UINavigationController“控制器阵列”的存在是为了检查自己。

@property(nonatomic, copy) NSArray *viewControllers 

最后,您可以为您的控制器创建一个强大的参考,但根本没有必要。它非常快速地创建一个新的控制器。如果有的话,我会缓存呈现在其上的数据,而不是强有力地参考它。这样可以避免用户等待已经下载的数据。

希望它有帮助。

+0

也谢谢! – ihodo 2012-03-11 16:01:51

+0

不客气。 upvote如果你想:) – 2012-03-11 16:04:25