深度解析iOS应用程序的生命周期

来源:互联网 发布:mac 如何设置密码 编辑:程序博客网 时间:2024/06/09 16:24
订阅移动开发RSSCSDN首页> 移动开发

深度解析iOS应用程序的生命周期

发表于2015-06-23 11:058494次阅读| 来源CSDN9 条评论| 作者刘耀柱

移动开发iOS开发经验开发工具数据结构设计模式架构移动应用MVC
摘要:iOS应用程序一般都是由自己编写的代码和系统框架组成,系统框架提供一些基本infrastructure给App来运行,而开发者则自己编写代码定制App的外观和行为,了解iOS Infrastructure及其如何工作对编写App很有帮助。

iOS应用程序一般都是由自己编写的代码和系统框架(system frameworks)组成,系统框架提供一些基本infrastructure给所有App来运行,而你提供自己编写的代码来定制App的外观和行为。因此,了解iOS Infrastructure和它们如何工作对编写App是很有帮助的。

Main函数入口

所有基于C编写的App的入口都是main函数,但iOS应用程序有点不同。不同就是你不需要为iOS应用程序而自己编写main函数,当你使用Xcode创建工程的时候就已经提供了。除非一些特殊情况,否则你不应该修改Xcode提供的main函数实现。示例代码如下:

[cpp] view plaincopy
  1. #import <UIKit/UIKit.h>  
  2. #import "AppDelegate.h"  
  3.   
  4. int main(int argc, char * argv[])  
  5. {  
  6.     @autoreleasepool {  
  7.         return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));  
  8.     }   
  9. }  

上面实例代码中有一个很重要的函数UIApplicationMain,它主要是创建App的几个核心对象来处理以下过程:

  1. 从可用Storyboard文件加载用户界面;
  2. 调用AppDelegate自定义代码来做一些初始化设置;
  3. 将App放入Main Run Loop环境中来响应和处理与用户交互产生的事件。

应用程序的架构

iOS应用程序都遵循Model-View-Controller的架构,Model负责存储数据和处理业务逻辑,View负责显示数据和与用户交互,Controller是两者的中介,协调Model和View相互协作。它们的通讯规则如下:

1. Controller能够访问Model和View,Model和View不能互相访问。


2. 当View与用户交互产生事件时,使用target-action方式来处理。


3. 当View需要处理一些特殊UI逻辑或获取数据源时,通过delegate或data source方式交给Controller来处理。


4. Model不能直接与Controller通信,当Model有数据更新时,可以通过Notification或KVO (Key Value Observing)来通知Controller更新View。


了解iOS的MVC设计模式之后,我们从下图来了解在MVC模式下iOS应用程序有哪些关键对象以及它们职责主要是什么?


  • UIApplication对象

用户与iOS设备交互时产生的事件(Multitouch Events,Motion Event,Remote Control Event)交由UIApplication对象来分发给control objects(UIControl)对应的target objects来处理并且管理整个事件循环,而一些关于App运行时重要事件委托给app delegate来处理。

  • App delegate对象

App delegate对象遵循UIApplicationDelegate协议,响应app运行时重要事件(app启动、app内存不足、app终止、切换到另一个app、切回app),主要用于app在启动时初始化一些重要数据结构;例如,初始化UIWindow,设置一些属性,为window添加rootViewController。

  • View controller对象

View Controller有一个view属性是view层次结构中的根view,你可以添加子view来构建复杂的view;controller有一些viewDidLoad、viewWillAppear等方法来管理view的生命周期;由于它继承UIResponder,所有还会响应和处理用户事件。

  • Documents和data model对象

data model对象主要用来存储数据。例如,饿了么app在搜索切换地址后,有历史记录搜索地址历史,当app下次启动时,读取和显示搜索地址历史。

document对象(继承UIDocument)用来管理一些或所有的data model对象。document对象并不是必须的,但提供一种方便的方式来分组属于单个文件或多个文件的数据。

  • UIWindow对象

UIWindow对象位于view层次结构中的最顶层,它充当一个基本容器而不显示内容,如果想显示内容,添加一个content view到window。

它也是继承UIResponder,所以它也是会响应和处理用户事件。

  • View、control、layer对象

View对象可以通过addSubview和removeFromSuperview 等方法管理view的层次结构,使用layoutSubviews、layoutIfNeeded和setNeedsLayout等方法布局view的层次结构,当你发现系统提供view已经满足不了你想要的外观需求时,可以重写drawRect方法或通过layer属性来构造复杂的图形外观和动画。还有一点,UIView也是继承UIResponder,所以也能够处理用户事件。

Control对象通常就是处理特定类型用户交互的View,常用的有button、switch、text field等。

除了使用View和Control来构建view层次结构来影响app外观之外,还可以使用Core Animation框架的Layer对象来渲染view外观和构建复杂的动画。

Main Run Loop

一个iOS应用程序的main run loop主要作用是处理所有与用户相关的事件。UIApplication对象在启动时就设置main run loop和使用它来处理事件和更新基于view的界面。正如它的名字显示,main run loop是运行在应用程序的主线程。这样就确保与接收到用户相关的事件被有序地处理。

下图显示main run loop的架构和用户事件最终是怎样被应用程序处理。当用户与设备交互时,系统就会生成与交互关联的事件,然后被应用程序的UIKit通过一个特殊的端口来分发。应用程序把事件放入队列,然后逐个分发到main run loop来执行。UIApplication对象是第一个对象接收到事件,然后决定怎样处理它。一个touch event通常都被分发到main window对象,然后依次分发到发生触碰的view。其他event的接收事件对象路径可能有点不同。


大多数的事件通过使用main run loop来分发,但有些不是。有些事件被发送到一个delegate对象或传递到你提供的block中。想了解更多如何处理大多数类型的事件,其中包括touch、remote control、motion、accelerometer和gyroscopic等事件,请查阅Event Handle Guide for iOS。

本文导读

  • 第1页:深度解析iOS应用程序的生命周期
  • 第2页:delegate对象方法汇总以及应用程序的终止
11
 
2
  • iOS开发实践:用Swift和Core Animatoin创建圆形图片加载动画
  • iOS开发的22个奇谲巧技
  • 手把手教学:详解Swift中的iOS设计模式
  • 被滥用的移动UX模式
  • 深入理解Objective-C的Runtime机制
  • Android应用架构变更背后的经验、失误与推论

已有9条评论

还可以再输入500个字
A题升级干Boss欢迎您!

  • 最新评论
  • 最热评论

南城以南这么火 2015-07-13 10:13
mark
   回复
叫我困兽 2015-07-08 09:46
mark
   回复
zj510 2015-06-26 21:14
斯坦福大学的那个教授的图,画的真形象。那个公开课还是非常值得一看的。
   回复
josslin025 2015-06-25 17:29
just cool
   回复
jl_1943 2015-06-25 13:58
mark
   回复
qq_26789967 2015-06-24 13:43
nice.
   回复
梅子黄时_宿于松下 2015-06-24 10:01
参考资料呢?怎么不给个链接地址
   回复
Lee_lisa520 2015-06-24 09:28
这是斯坦福大学那个图吧
1票,来自stonxer    回复
lovexieyuan520 2015-06-23 23:54
mark
   回复
请您注意
  • ·自觉遵守:爱国、守法、自律、真实、文明的原则
  • ·尊重网上道德,遵守《全国人大常委会关于维护互联网安全的决定》及中华人民共和国其他各项有关法律法规
  • ·严禁发表危害国家安全,破坏民族团结、国家宗教政策和社会稳定,含侮辱、诽谤、教唆、淫秽等内容的作品
  • ·承担一切因您的行为而直接或间接导致的民事或刑事法律责任
  • ·您在CSDN新闻评论发表的作品,CSDN有权在网站内保留、转载、引用或者删除
  • ·参与本评论即表明您已经阅读并接受上述条款
  • CSDN官方微信
  • 扫描二维码,向CSDN吐槽
  • 微信号:CSDNnews
程序员移动端订阅下载
每日资讯快速浏览

微博关注

相关热门文章

  • 拥抱Android Studio(二):Android Studio与Gradle深入
  • 《近匠》Worktile王涛:典型MEAN架构下的团队协作工具
  • 2015年改变游戏产业的5大事件
  • 如何反编译Android 5.0 framework
  • 谷歌地图API的三大开源替代品
  • 【CTO讲堂】密码泄露事件频发?探秘其背后的本质
  • 关于HTC Vive,值得开发者关注的三个问题
  • HTC Vive开发者峰会:破除迷思,窥探VR前沿
  • MuleSoft发布Anypoint平台,基于云的异步消息传递
  • 百度开发者中心首届智能语音创新大赛圆满落幕

热门标签

  • Hadoop
  • AWS
  • 移动游戏
  • Java
  • Android
  • iOS
  • Swift
  • 智能硬件
  • Docker
  • OpenStack
  • VPN
  • Spark
  • ERP
  • IE10
  • Eclipse
  • CRM
  • JavaScript
  • 数据库
  • Ubuntu
  • NFC
  • WAP
<iframe id="cproIframe_u2385656_5" width="960" height="180" src="http://pos.baidu.com/acom?adn=0&amp;adp=1&amp;at=0&amp;aurl=&amp;c01=1&amp;cad=1&amp;ccd=24&amp;cec=UTF-8&amp;cfv=17&amp;ch=0&amp;col=zh-CN&amp;conBW=1&amp;conOP=1&amp;cpa=1&amp;cpro_lu=1%2C%23dfe4f9%2C%23000000%2C%E5%AE%8B%E4%BD%93&amp;dai=5&amp;dis=0&amp;ltr=&amp;ltu=http%3A%2F%2Fwww.csdn.net%2Farticle%2F2015-06-23%2F2825023&amp;lu_161=0&amp;lunum=6&amp;n=csdnbaidu_cpr&amp;pat=1&amp;pcs=976x682&amp;pih=0&amp;pis=10000x10000&amp;piw=0&amp;ps=7283x8&amp;psr=1280x800&amp;pss=976x7323&amp;ptbg=90&amp;ptp=0&amp;ptt=0&amp;qn=0d1d0d1cce1dc83a&amp;rad=&amp;rsi0=960&amp;rsi1=180&amp;rsi5=4&amp;rss0=%23FFFFFF&amp;rss1=%23FFFFFF&amp;rss2=%23000000&amp;rss3=&amp;rss4=&amp;rss5=&amp;rss6=%23e10900&amp;rss7=&amp;scale=&amp;skin=tabcloud_skin_5&amp;stid=5&amp;td_id=2385656&amp;tft=0&amp;titFF=%25E5%25BE%25AE%25E8%25BD%25AF%25E9%259B%2585%25E9%25BB%2591&amp;titFS=14&amp;titSU=0&amp;titTA=left&amp;tlt=1&amp;tn=baiduCustNativeAD&amp;tpr=1451117027564&amp;ts=1&amp;version=2.0&amp;xuanting=0&amp;dtm=BAIDU_DUP2_SETJSONADSLOT&amp;dc=2&amp;di=u2385656&amp;ti=%E6%B7%B1%E5%BA%A6%E8%A7%A3%E6%9E%90iOS%E5%BA%94%E7%94%A8%E7%A8%8B%E5%BA%8F%E7%9A%84%E7%94%9F%E5%91%BD%E5%91%A8%E6%9C%9F-CSDN.NET&amp;tt=1451117027792.1007.1048.1049" align="center,center" marginwidth="0" marginheight="0" scrolling="no" frameborder="0" allowtransparency="true"></iframe>
关闭
0 0
原创粉丝点击