iOS中的两种主要架构及其优缺点浅析
凡是程序的开发者,应该对程序的架构都不陌生。一个程序的架构的好坏对这个程序有着非常重要的作用。今天我们来看一下iOS开发中用要的两种主流的程序架构。这个过程中我们主要以例子的形式展开。
我们来看第一种架构:如下图所示:
这种程序的架构主要原理是创建了一个导航控制器来控制页面之间的切换。这种架构一般把主界面作为导航控制器的根视图控制器。在上图所求的程序架构中,主界面管理了四个界面:微信界面,发现界面,联系人界面,关于我界面。如果程序是第一次运行的时候,进入用户指引界面,然后进入登录界面,输入账户名和密码进入主界面。 在关于我界面中有两种情况:1.在程序中的关于我界面中退出登录后,下次进入程序的时候应该进入登录界面,然后输入账户名和密码进入主界面。 2.有这种需求,在关于我这个界面中查看用户指引界面。
这种程序的架构的思路就是在用到哪个界面的时候,把该界面的的头文件包含进来。用导航控制器把这个界面push压栈,来实现页面之间的切换。当需要用到主界面的时候,popToRoot就实现了到主界面的切换。
但是这种架构的缺点是什么呢:
1.我们来分析一下整个程序。因为主界面是导航控制器的根视图控制器。由于根视图控制器在导航控制器的栈里是不能出栈的,这是导航控制器的特性决定的。而在这种架构中主界面又包含了四个界面。在程序的运行过程中或者是存在后台运行的话,主控制器的Home页面太大了,并且一直存在内存中运行,会造成内存的开销很大。
2.每当程序重新进入的时候,需要更新主界面中的状态。例如:当在关于我的界面中退出的时候,下次重新登录的时候,如果不更新主界面的状态的话。会直接进入关于我的这个界面中。这种需求并不是我们想要的状态。
下面我们来看第二种架构。
很明显可以看到,这个架构会更加清析,更加明了。我们来说一下这个程序的原理:这个程序的架构是先通过创建一个继承自NSObject对象的主控制器,通过这个主控制器来管理页面之间的切换。我们都知道一个程序一般只有一个window,通过改变window的根视图控制器来实现不同页面之间的切换。
同样的,没有完美的架构,只有更适合的。我们接下来看看这个架构中存在的优缺点。
1.我们先来说下优点。显然,这个程序架构的思路很是清楚。在复杂的页面之间的切换的时候,不需要反复包含切换页面的头文件 。在程序的执行过程中,只需要找到清楚的知道到底谁才是window的根视图控制器就可以实现不同页面之间的切换。当然这个架构中最主要的工作就是想办法对主控制器方法的封装。
2.我们接下来看下这个架构的缺点:这里没有了导航控制器,在内存中一直存在的就剩下主控制器(mainViewController)了,但是,仔细考虑会发现,这个架构中,会对主控制器管理的其它页面进行反复的申请内存和销毁,同样的主界面包含很多页面。这样也会影响程序的执行效率。
所以,综上,第二种架构一般多用于ARC环境中使用。
为了程序的执行效率,一种很好的解决方案就是把主控制器(mainViewController)做成一个单例的对象,单例的对象在整个程序的运行过程中只有一个对象,避免了,使用的时候重新申请内存造成的不必要的开销。而其它三个界面一般会把它们做成@property类别。这样就能保证当重新载入新的页面的时候先判断是否在内存中。如果在的话就直接取出来就行。
iOS中的两种主要架构及其优缺点浅析的更多相关文章
- iOS中的两种搜索方式UISearchDisplayController和UISearchController
大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;) 以前iOS的搜索一般都使用UISearchDisplayCon ...
- ios中的几种多线程实现
iOS 支持多个层次的多线程编程,层次越高的抽象程度越高,使用起来也越方便,也是苹果最推荐使用的方法.下面根据抽象层次从低到高依次列出iOS所支持的多线程编程范式:1, Thread;2, Cocoa ...
- MySQL中的两种临时表
MySQL中的两种临时表 伯乐在线2016-07-06 05:16:52阅读(4556)评论(3) 声明:本文由入驻搜狐公众平台的作者撰写,除搜狐官方账号外,观点仅代表作者本人,不代表搜狐立场.举报 ...
- ORACLE 查询一个数据表后通过遍历再插入另一个表中的两种写法
ORACLE 查询一个数据表后通过遍历再插入另一个表中的两种写法 语法 第一种: 通过使用Oracle语句块 --指定文档所有部门都能查看 declare cursor TABLE_DEPT and ...
- Linux中的两种守护进程stand alone和xinetd
Linux中的两种守护进程stand alone和xinetd --http://www.cnblogs.com/itech/archive/2010/12/27/1914846.html#top 一 ...
- validate插件:验证密码没有空格 用户名是5-10位 至少包含数字和大小写字母中的两种字符
//校验密码是否含有空格 jQuery.validator.addMethod("notblank", function(value, element) { var pwdblan ...
- Crystal Report在.net中的两种显示方式
Crystal Report在.net中的两种显示方式 编写人:CC阿爸 2014-7-29 近来在完成深圳一公司的项目,对方对各方面要求相当严格,一不满意就拒绝签收,为了对修正水晶报表显示及导出的一 ...
- C#中的两种debug方法
这篇文章主要介绍了C#中的两种debug方法介绍,本文讲解了代码用 #if DEBUG 包裹.利用宏定义两种方法,需要的朋友可以参考下 第一种:需要把调试方法改成debug代码用 #if DEBU ...
- eclipse中的两种Jre 及 Jre与Jdk的区别
分类: ——————————区分eclipse中的两种Jre———————- (Eclipse也是一个普通的Java程序,因此必须有一个JRE做为运行环境.如果你的机器上没有安装任何JRE(或者JDK ...
随机推荐
- Sqli-LABS通关笔录-10
好像咋整都没辙.实在是关卡越高越不好整. 弄报错.咋整咋不报错. and sleep(10);鸭蛋的也不好搞.实在没辙.就看源码了. 由代码得出payload: THE END
- #Deep Learning回顾#之基于深度学习的目标检测(阅读小结)
原文链接:https://www.52ml.net/20287.html 这篇博文主要讲了深度学习在目标检测中的发展. 博文首先介绍了传统的目标检测算法过程: 传统的目标检测一般使用滑动窗口的框架,主 ...
- js清空array数组的方法
方式1,splice Js代码 ,,,}; ary.length = ; Java中会报错,编译通不过. 而JS中则可以,且将数组清空了,如 Js代码 var ary = [1,2,3,4]; ...
- 11 AlarmHandler定时处理类——Live555源码阅读(一)基本组件类
这是Live555源码阅读的第一部分,包括了时间类,延时队列类,处理程序描述类,哈希表类这四个大类. 本文由乌合之众 lym瞎编,欢迎转载 http://www.cnblogs.com/oloroso ...
- CH Round #54 - Streaming #5 (NOIP模拟赛Day1)解题报告
最近参加了很多CH上的比赛呢~Rating--了..题目各种跪烂.各种膜拜大神OTZZZ T1珠 描述 萌蛋有n颗珠子,每一颗珠子都写有一个数字.萌蛋把它们用线串成了环.我们称一个数字串是有趣的,当且 ...
- Python自动化之sqlalchemy
如果该数 据库支持 自增列 ,则 SQLAlchemy 默认 自动 设定 表中第一个 类型 为整形 的主键 为自增列 ORM介绍 orm英文全称object relational mapping,就是 ...
- java复制文件
package com.test.tes; import java.io.File; import java.io.FileInputStream; import java.io.FileOutput ...
- php类与对象
1.类与对象 对象:实际存在该类事物中每个实物的个体.$a =new User(); 实例化后的$a 引用:php的别名,两个不同的变量名字指向相同的内容 封装: 把对象的属性和方法组织在一个类(逻辑 ...
- JSON代码格式化 进行查询筛选
JSON是前端编程经常用到的格式,对于PHP或者Python,解析JSON都不是什么大事,尤其是PHP的json_encode和json_decode,干的相当的漂亮.Linux下也有处理处理JSON ...
- CentOS Linux VPS安装IPSec+L2TP VPN
CentOS Linux VPS安装IPSec+L2TP VPN 时间 -- :: 天使羊波波闪耀光芒 相似文章 () 原文 http://www.live-in.org/archives/818.h ...