Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/129.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c UINavigationController和UIViewController是如何工作的?_Objective C_Ios_Uiviewcontroller_Uinavigationcontroller - Fatal编程技术网

Objective c UINavigationController和UIViewController是如何工作的?

Objective c UINavigationController和UIViewController是如何工作的?,objective-c,ios,uiviewcontroller,uinavigationcontroller,Objective C,Ios,Uiviewcontroller,Uinavigationcontroller,我正在学习UINavigationController和UIViewControllers。下面是我构建的简单应用程序。请注意,我使用了圆弧 我的应用程序有一个导航控制器和两个视图控制器(我们称它们为FirstViewController和SecondViewController)。当应用程序启动导航控制器时,按下堆栈上的FirstViewController 在FirstViewController中,我有一个按钮,当触摸到第二个viewcontroller时,它会按下该按钮。下面是一些代码

我正在学习
UINavigationController
UIViewController
s。下面是我构建的简单应用程序。请注意,我使用了圆弧

我的应用程序有一个导航控制器和两个视图控制器(我们称它们为
FirstViewController
SecondViewController
)。当应用程序启动导航控制器时,按下堆栈上的
FirstViewController

FirstViewController
中,我有一个按钮,当触摸到第二个viewcontroller时,它会按下该按钮。下面是一些代码

FirstViewController.m

-(IBAction)pushSecondViewController
{
    SecondViewController *secondViewController = [SecondViewController alloc]init];
    [self.navigationController pushViewController:secondViewController animated:YES];
}
-(IBAction)popViewController
{
    [self.navigationController popViewControllerAnimated:YES];
}
在第二个视图控制器中,我有一个按钮,可以从堆栈中弹出当前视图控制器

SecondViewController.m

-(IBAction)pushSecondViewController
{
    SecondViewController *secondViewController = [SecondViewController alloc]init];
    [self.navigationController pushViewController:secondViewController animated:YES];
}
-(IBAction)popViewController
{
    [self.navigationController popViewControllerAnimated:YES];
}
到目前为止,一切顺利。以下是我的问题:

导航控制器是否检查现有的
SecondNavigationController
实例,如果不存在,则创建一个新实例


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

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


如果确实要保留第二个视图控制器,请使其成为第一个视图控制器的强属性,但除非你确实有理由这样做,否则不要这样做——你使用的方法是标准的,创建一个新的视图控制器通常比使用甚至不在屏幕上的视图控制器占用大量内存要好。内存比处理器资源更为稀缺,创建视图控制器时有发生

我同意jrturton的观点,并添加了以下指导原则

首先,在我看来,把控制器做成单例不是一个好主意

然后,您必须自己检查
UINavigationController
“controllers array”中是否存在某种类型的实例

最后,您可以为控制器创建一个强引用,但根本不需要。新控制器的创建非常快。如果有数据的话,我会缓存上面的数据,而不是它的强引用。这是为了避免用户等待已下载的数据


希望有帮助。

不,我不想在第二个视图控制器周围逗留。我很好奇导航控制器是如何工作的。谢谢你的解释!为了不开始新的话题。如果我的应用程序包含四个视图控制器,那么第一个和第二个视图控制器在应用程序中只使用一次。我是否应该从导航控制器中弹出它们([self.navigationController popViewControllerAnimated:YES])以不使用内存?否,仅使用推和弹出在导航堆栈上下移动。