iOS的生命周期
- iOS应用程序一般都是由自己编写的代码和系统框架组成。系统框架提供了一些基本的infrastructure给APP来运行,而开发者则自己编写代码定制APP的外观和行为,了解iOS infrastructure及其如何工作对编写APP很有帮助。
Main函数入口
所有基于C编写的APP的入口都是main函数,但iOS应用程序有点不同。不同就是你不需要为iOS应用程序而编写main函数,当你使用Xcode创建工程的时候就已经提供了。除非一些特殊情况,否则你不应该修改Xcode提供的main函数实现。实例代码见下
#import <UIKit/UIKit.h>
#import "AppDelegate.h"
int main ( int argc, char *argv[] )
{
@autoreleasepool{
return UIApplicationMain(argc, argv ,nil , NSStringFromClass([AppDelegate class]));
}
}
上面实例代码中有一个很重要的函数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设计模式之后,我们从下图了解在NVC模式下iOS应用程序有哪些管家对象以及它们职责主要是什么?
UIApplication
对象
用户与iOS设备交互时产生的事件(Multitouch Events,Motion Event,Remote Control Event)交互由UIApplication对象来分给control objects(UIControl)对应的target objects来处理并且管理整个事件循环,而一些关于APP运行时重要事件委托给app delegate来处理App delegate
对象
APP delegate 对象遵循UIApplication Delegate协议,响应app运行时重要事件(app启动,APP内存不足,APP终止,切换到另一个APP,切回APP),主要用于APP在启动时初始化一些重要数据结构;例如,初始化UIWindow,设置一些属性,为window添加rootViewController.View controller
对象
View controller有一个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。
它也是继承UIRsponder,所以它也是会响应和处理用户事件。View,control,layer
对象
Vew对象可以通过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中。
应用程序的状态和多任务
有时系统会从APP一种状态切换到另一种状态响应系统发生的事件。例如,当用户按下Home键,电话打入或其他终端发生时,当前运行的应用程序会切换状态来响应。应用程序的状态有以下几种:
- Not running:APP还没运行
- Inactive:APP运行在foreground但没有接收事件
- Active: APP运行在foreground和正在接收事件
- Background:运行在background和正在运行代码
- Suspended:运行在background但没有执行代码
大多数发生状态转换时都会调用delegate对象对应的方法响应APP的状态改变。下面汇总了delegate对象的所有方法,当APP状态发生转换时,你可能会使用到它们
- application:willFinishLaunchingWithOptions: - 这个方法是你在启动时的第一次机会来执行代码
- application:didFinishLaunchingWithOptions:- 这个方法允许你在现实APP给用户之前执行最后的初始化操作;
- applicationDidBecomeActive:- app已经切换到active状态后需要执行的操作。
- applicationWillResignActive:- app江阳从前台切换到后台需要时执行的操作
- applicationDidEnterBackground:- app已经进入后台后需要执行的操作
- applicationWillEnterForeground:- APP将要从后台切换到前台需要执行的操作,但APP还不是active状态
- applicationWillTerminate:- app将要结束时需要执行的操作
原文链接:http://www.jianshu.com/p/550e5b1d4779
著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。
iOS -> 视图的生命周期 与 应用程序的生命周期
1、视图的生命周期
1、 alloc 创建对象,分配空间
2、 init (initWithNibName) 初始化对象,初始化数据
3、 loadView 从nib载入视图 ,除非你没有使用xib文件创建视图
4、 viewDidLoad 载入完成,可以进行自定义数据以及动态创建其他控件
5、 viewWillAppear视图将出现在屏幕之前,马上这个视图就会被展现在屏幕上了
6、 viewDidAppear 视图已在屏幕上渲染完成
7、viewWillDisappear 视图将被从屏幕上移除之前执行
8、viewDidDisappear 视图已经被从屏幕上移除,用户看不到这个视图了
9、dealloc 视图被销毁,此处需要对你在init和viewDidLoad中创建的对象进行释放.
10、viewVillUnload- 当内存过低,即将释放时调用;
11、viewDidUnload-当内存过低,释放一些不需要的视图时调用。
2、应用程序的生命周期
1,启动但还没进入状态保存 :
- (BOOL)application:(UIApplication *)application willFinishLaunchingWithOptions:(NSDictionary *)launchOptions
2,基本完成程序准备开始运行:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
3,当应用程序将要入非活动状态执行,应用程序不接收消息或事件,比如来电话了:
- (void)applicationWillResignActive:(UIApplication *)application
4,当应用程序入活动状态执行,这个刚好跟上面那个方法相反:
- (void)applicationDidBecomeActive:(UIApplication *)application
5,当程序被推送到后台的时候调用。所以要设置后台继续运行,则在这个函数里面设置即可:
- (void)applicationDidEnterBackground:(UIApplication *)application
6,当程序从后台将要重新回到前台时候调用,这个刚好跟上面的那个方法相反:
- (void)applicationWillEnterForeground:(UIApplication *)application
7,当程序将要退出是被调用,通常是用来保存数据和一些退出前的清理工作:
- (void)applicationWillTerminate:(UIApplication *)application
iOS的生命周期的更多相关文章
- 图解ios程序生命周期
图解ios程序生命周期 应用程序启动后状态有Active.Inactive.Background.Suspended.Not running这5种状态,几种状态的转换见下图: 在AppDelegate ...
- (转)深入浅出 iOS 之生命周期
原文:http://www.cocoachina.com/applenews/devnews/2011/0817/3129.html 深入浅出 iOS 之生命周期 发布于:2011-08-17 10: ...
- 【转】深入浅出 iOS 之生命周期
[iOS]深入浅出 iOS 之生命周期 深入浅出 iOS 之生命周期 http://blog.csdn.net/kesalin/article/details/6691766 罗朝辉(http:// ...
- iOS ViewController生命周期
ViewController是view的controller,viewController的职责主要包括管理内部各个view的加载显示与卸载,同时负责与其他ViewController的通信和协调. ...
- iOS视图生命周期与视图控制器关系
iOS中视图是一个应用的重要组成部分,功能的实现与其息息相关,而视图控制器控制着视图,其重要性在整个应用中不言而喻. 视图生命周期与视图控制器关系 以视图的5种状态为基础,我们来系统的了解一下 ...
- 深入浅出 iOS 之生命周期
转:http://blog.csdn.net/kesalin/article/details/6691766 iOS应用程序的生命周期相比 Android 应用程序的生命周期来说,没那么简明易懂,但是 ...
- 【Xamarin 开发 IOS --IOS ViewController生命周期】
ViewController ViewController是IOS开发中MVC模式中的C,ViewController是view的controller,ViewController的职责主要包括管理内 ...
- iOS程序生命周期 AppDelegate
iOS的应用程序的生命周期,还有程序是运行在前台还是后台,应用程序各个状态的变换,这些对于开发者来说都是很重要的. iOS系统的资源是有限的,应用程序在前台和在后台的状态是不一样的.在后台时,程序会受 ...
- iOS开发——生命周期
为了处理好应用程序的挂起.暂停等情况下的数据保存,或对应添加所需处理,我们必须了解ios生命周期. 但是不要去背去记,做个实验就好. - (BOOL)application:(UIApplicatio ...
随机推荐
- PDMS模型导出RVM格式
2 .将PDMS中对象模型导出为RVM格式的宏文件代码如下: eg:如果要导出某几个房间内的全部bran equi !strus = array()!strus.append(|/1RXR246ZL| ...
- php ajax请求和返回
define('NOW_TIME', $_SERVER['REQUEST_TIME']); define('REQUEST_METHOD',$_SERVER['REQUEST_METHOD']); d ...
- “菜”鸟理解.NET Framework(CLI,CLR,CTS,CLS,BCL,FCL)
既然要学.NET,就要先认识认识她,我不喜欢大段大段文字的东西,自己通过理解,画个图,来看看.NET的沉鱼落雁,闭月羞花之容. 最下层蓝色部分是.NET Framework的基础,也是所有应用软件的基 ...
- 掌握Thinkphp3.2.0----SQL查询
首先,先谈一下对查询的理解:查询的对象是数据库中的数据表,一个或多个:查询的限制就是各种条件或要求:查询的结果=表对象+限制(条件). 对数据表的操作(CRUD)查询是最复杂也是最关键的一步!'SEL ...
- 展望 2017年商业智能BI 发展的趋势
在展望2017年商业智能 BI 发展趋势前,我们先来了解一下商业智能 BI 发展的几个重要阶段. 传统 BI 和新型 BI 的分水岭(2013年) 大背景 在2013年以前相当长的一个周期(2005年 ...
- ThinkCmfX模板常量
一.public文件: 1.各种js文件,包括cookie.js.ajaxFrom.js等系统自带的js文件 2.simpleboot:bootstrap.图标font文件 二.themes:前端模板 ...
- 带你玩转JavaWeb开发之四 -如何用JS做登录注册页面校验
今日内容 使用JQuery完成页面定时弹出广告 使用JQuery完成表格的隔行换色 使用JQuery完成复选框的全选效果 使用JQuery完成省市联动效果 使用JQuery完成下列列表左右选择 使用J ...
- iOS真机测试,为Provisioning添加设备 -- based xcode6[原]
iOS真机测试, 我们需要添加几台新的设备进行测试.我们只需要对Provisioning Profiles 进行更新. 1. 在苹果开发者中心添加测试设备 打开苹果Certificates, Ide ...
- Magento学习第一课——目录结构介绍
Magento学习第一课--目录结构介绍 一.Magento为何强大 Magento是在Zend框架基础上建立起来的,这点保证了代码的安全性及稳定性.选择Zend的原因有很多,但是最基本的是因为zen ...
- 关于smarty的一些个人笔记
注释为{注释} 注意下面代码中<%extends file="路径"%>和<%widget name="路径"%>这两个路径中的区别 c ...