iOS中的两种主要架构及其优缺点浅析
我们来看第一种架构:如下图所示:
这种程序的架构主要原理是创建了一个导航控制器来控制页面之间的切换。这种架构一般把主界面作为导航控制器的根视图控制器。在上图所求的程序架构中,主界面管理了四个界面:微信界面,发现界面,联系人界面,关于我界面。如果程序是第一次运行的时候,进入用户指引界面,然后进入登录界面,输入账户名和密码进入主界面。 在关于我界面中有两种情况:1.在程序中的关于我界面中退出登录后,下次进入程序的时候应该进入登录界面,然后输入账户名和密码进入主界面。 2.有这种需求,在关于我这个界面中查看用户指引界面。
这种程序的架构的思路就是在用到哪个界面的时候,把该界面的的头文件包含进来。用导航控制器把这个界面push压栈,来实现页面之间的切换。当需要用到主界面的时候,popToRoot就实现了到主界面的切换。
但是这种架构的缺点是什么呢:
1.我们来分析一下整个程序。因为主界面是导航控制器的根视图控制器。由于根视图控制器在导航控制器的栈里是不能出栈的,这是导航控制器的特性决定的。而在这种架构中主界面又包含了四个界面。在程序的运行过程中或者是存在后台运行的话,主控制器的Home页面太大了,并且一直存在内存中运行,会造成内存的开销很大。
2.每当程序重新进入的时候,需要更新主界面中的状态。例如:当在关于我的界面中退出的时候,下次重新登录的时候,如果不更新主界面的状态的话。会直接进入关于我的这个界面中。这种需求并不是我们想要的状态。
下面我们来看第二种架构。
很明显可以看到,这个架构会更加清析,更加明了。我们来说一下这个程序的原理:这个程序的架构是先通过创建一个继承自NSObject对象的主控制器,通过这个主控制器来管理页面之间的切换。我们都知道一个程序一般只有一个window,通过改变window的根视图控制器来实现不同页面之间的切换。
同样的,没有完美的架构,只有更适合的。我们接下来看看这个架构中存在的优缺点。
1.我们先来说下优点。显然,这个程序架构的思路很是清楚。在复杂的页面之间的切换的时候,不需要反复包含切换页面的头文件 。在程序的执行过程中,只需要找到清楚的知道到底谁才是window的根视图控制器就可以实现不同页面之间的切换。当然这个架构中最主要的工作就是想办法对主控制器方法的封装。
2.我们接下来看下这个架构的缺点:这里没有了导航控制器,在内存中一直存在的就剩下主控制器(mainViewController)了,但是,仔细考虑会发现,这个架构中,会对主控制器管理的其它页面进行反复的申请内存和销毁,同样的主界面包含很多页面。这样也会影响程序的执行效率。
所以,综上,第二种架构一般多用于ARC环境中使用。
为了程序的执行效率,一种很好的解决方案就是把主控制器(mainViewController)做成一个单例的对象,单例的对象在整个程序的运行过程中只有一个对象,避免了,使用的时候重新申请内存造成的不必要的开销。而其它三个界面一般会把它们做成@property类别。这样就能保证当重新载入新的页面的时候先判断是否在内存中。如果在的话就直接取出来就行。