凡是程序的开发者,应该对程序的架构都不陌生。一个程序的架构的好坏对这个程序有着非常重要的作用。今天我们来看一下iOS开发中用要的两种主流的程序架构。这个过程中我们主要以例子的形式展开。

  我们来看第一种架构:如下图所示:

   这种程序的架构主要原理是创建了一个导航控制器来控制页面之间的切换。这种架构一般把主界面作为导航控制器的根视图控制器。在上图所求的程序架构中,主界面管理了四个界面:微信界面,发现界面,联系人界面,关于我界面。如果程序是第一次运行的时候,进入用户指引界面,然后进入登录界面,输入账户名和密码进入主界面。 在关于我界面中有两种情况:1.在程序中的关于我界面中退出登录后,下次进入程序的时候应该进入登录界面,然后输入账户名和密码进入主界面。 2.有这种需求,在关于我这个界面中查看用户指引界面。

  这种程序的架构的思路就是在用到哪个界面的时候,把该界面的的头文件包含进来。用导航控制器把这个界面push压栈,来实现页面之间的切换。当需要用到主界面的时候,popToRoot就实现了到主界面的切换。

  但是这种架构的缺点是什么呢:

  1.我们来分析一下整个程序。因为主界面是导航控制器的根视图控制器。由于根视图控制器在导航控制器的栈里是不能出栈的,这是导航控制器的特性决定的。而在这种架构中主界面又包含了四个界面。在程序的运行过程中或者是存在后台运行的话,主控制器的Home页面太大了,并且一直存在内存中运行,会造成内存的开销很大。

  2.每当程序重新进入的时候,需要更新主界面中的状态。例如:当在关于我的界面中退出的时候,下次重新登录的时候,如果不更新主界面的状态的话。会直接进入关于我的这个界面中。这种需求并不是我们想要的状态。

  下面我们来看第二种架构。

   

   很明显可以看到,这个架构会更加清析,更加明了。我们来说一下这个程序的原理:这个程序的架构是先通过创建一个继承自NSObject对象的主控制器,通过这个主控制器来管理页面之间的切换。我们都知道一个程序一般只有一个window,通过改变window的根视图控制器来实现不同页面之间的切换。

  同样的,没有完美的架构,只有更适合的。我们接下来看看这个架构中存在的优缺点。

  1.我们先来说下优点。显然,这个程序架构的思路很是清楚。在复杂的页面之间的切换的时候,不需要反复包含切换页面的头文件 。在程序的执行过程中,只需要找到清楚的知道到底谁才是window的根视图控制器就可以实现不同页面之间的切换。当然这个架构中最主要的工作就是想办法对主控制器方法的封装。

  2.我们接下来看下这个架构的缺点:这里没有了导航控制器,在内存中一直存在的就剩下主控制器(mainViewController)了,但是,仔细考虑会发现,这个架构中,会对主控制器管理的其它页面进行反复的申请内存和销毁,同样的主界面包含很多页面。这样也会影响程序的执行效率。

  所以,综上,第二种架构一般多用于ARC环境中使用。

  为了程序的执行效率,一种很好的解决方案就是把主控制器(mainViewController)做成一个单例的对象,单例的对象在整个程序的运行过程中只有一个对象,避免了,使用的时候重新申请内存造成的不必要的开销。而其它三个界面一般会把它们做成@property类别。这样就能保证当重新载入新的页面的时候先判断是否在内存中。如果在的话就直接取出来就行。

iOS中的两种主要架构及其优缺点浅析的更多相关文章

  1. iOS中的两种搜索方式UISearchDisplayController和UISearchController

    大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;) 以前iOS的搜索一般都使用UISearchDisplayCon ...

  2. ios中的几种多线程实现

    iOS 支持多个层次的多线程编程,层次越高的抽象程度越高,使用起来也越方便,也是苹果最推荐使用的方法.下面根据抽象层次从低到高依次列出iOS所支持的多线程编程范式:1, Thread;2, Cocoa ...

  3. MySQL中的两种临时表

    MySQL中的两种临时表 伯乐在线2016-07-06 05:16:52阅读(4556)评论(3) 声明:本文由入驻搜狐公众平台的作者撰写,除搜狐官方账号外,观点仅代表作者本人,不代表搜狐立场.举报 ...

  4. ORACLE 查询一个数据表后通过遍历再插入另一个表中的两种写法

    ORACLE 查询一个数据表后通过遍历再插入另一个表中的两种写法 语法 第一种: 通过使用Oracle语句块  --指定文档所有部门都能查看 declare cursor TABLE_DEPT and ...

  5. Linux中的两种守护进程stand alone和xinetd

    Linux中的两种守护进程stand alone和xinetd --http://www.cnblogs.com/itech/archive/2010/12/27/1914846.html#top 一 ...

  6. validate插件:验证密码没有空格 用户名是5-10位 至少包含数字和大小写字母中的两种字符

    //校验密码是否含有空格 jQuery.validator.addMethod("notblank", function(value, element) { var pwdblan ...

  7. Crystal Report在.net中的两种显示方式

    Crystal Report在.net中的两种显示方式 编写人:CC阿爸 2014-7-29 近来在完成深圳一公司的项目,对方对各方面要求相当严格,一不满意就拒绝签收,为了对修正水晶报表显示及导出的一 ...

  8. C#中的两种debug方法

    这篇文章主要介绍了C#中的两种debug方法介绍,本文讲解了代码用 #if DEBUG 包裹.利用宏定义两种方法,需要的朋友可以参考下   第一种:需要把调试方法改成debug代码用 #if DEBU ...

  9. eclipse中的两种Jre 及 Jre与Jdk的区别

    分类: ——————————区分eclipse中的两种Jre———————- (Eclipse也是一个普通的Java程序,因此必须有一个JRE做为运行环境.如果你的机器上没有安装任何JRE(或者JDK ...

随机推荐

  1. C++中的单例模式(转)

    单例模式也称为单件模式.单子模式,可能是使用最广泛的设计模式.其意图是保证一个类仅有一个实例,并提供一个访问它的全局访问点,该实例被所有程序模块共享.有很多地方需要这样的功能模块,如系统的日志输出,G ...

  2. 如何让JQuery报错-遁地龙卷风

    0.解决的问题 a.当选择器语法没有问题,找不到元素时,让jquery报错 b.选择器语法有问题,程序无法继续执行时,让jquery报错 主要针对传递字符串,尝试前请备份jquery库,最好改变名字加 ...

  3. HDU 4791 Alice's Print Service(2013长沙区域赛现场赛A题)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4791 解题报告:打印店提供打印纸张服务,需要收取费用,输入格式是s1 p1 s2 p2 s3 p3.. ...

  4. Codeforces 271 Div 2 C. Captain Marmot

    题目链接:http://codeforces.com/contest/474/problem/C 解题报告:给一个n,然后输入4*n个平面坐标系上的点,每四个点是一组,每个点有一个中心,这四个点可以分 ...

  5. HNU 12888 Encryption(map容器)

    题目链接:http://acm.hnu.cn/online/?action=problem&type=show&id=12890&courseid=274 解题报告:输入一个有 ...

  6. POJ2104 —— K-th number

    1.题目大意:区间第k小,什么修改没有... 2.分析:这个是可持久化线段树,也是主席树,解释一下,n个线段树是怎么存下的,就是每一颗线段树和前一个有logn个点不一样 然后我们只需要一个线段树开lo ...

  7. Git秘籍:在 Git 中进行版本回退

    导读 在这篇文章中,你将学到如何查看项目中的历史版本,如何进行版本回退,以及如何创建 Git 分支以便你可以大胆尝试而不会出现问题.快来试试吧. 在你的 Git 项目的历史中,你的位置就像是摇滚专辑中 ...

  8. C语言 homework(4)

    #include <stdio.h> int main(){ ; i=; ) { sum+=i; i++; } printf("sum=%d\n",sum); ; } ...

  9. bug-android之ActivityNotFoundException

    应用场景:用于安卓的短信发送功能 异常名称:Caused by: android.content.ActivityNotFoundException: No Activity found to han ...

  10. mysql 查询某个日期时间段,每天同一时间段的数据

    mysql 查询某个日期时间段,每天同一时间段的数据: SELECT * FROM t_a01_eltable WHERE DATE_FORMAT(acqtime,'%Y-%m-%d')>='2 ...