iOS 应用程序生命周期中那些不可忽视的“存在”

开发过Android应用的程序员都知道Android应用的生命周期更多是其组件的生命周期,例如Activity、Service。那么iOS应用程序的生命周期是怎样的呢?今天我们首先简单来了解一下。

iOS应用程序一般都是由自己编写的代码和系统框架(system frameworks)组成,系统框架提供一些基本infrastructure给所有app来运行,而自己编写的代码主要是根据需求来定制app的外观和行为的。

iOS的程序入口在main.m文件:

#import

#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环境中来响应和处理与用户交互产生的事件

UIApplicationMain函数,重点是后两个参数,分别表示程序的主要类(principal class)和代理类(delegate class)。如果主要类(principal
class)为nil,将从Info.plist中获取,如果Info.plist中不存在对应的key,则默认为UIApplication;而代理类(delegate class)将在新建工程时创建。

根据UIApplicationMain函数,程序将进入AppDelegate.m,这个文件是xcode新建工程时自动生成的。AppDelegate.m文件有关乎着应用程序的生命周期的方法。

应用程序的状态有以下几种:

  • Not running:app还没运行
  • Inactive:app运行在foreground但没有接收事件
  • Active:app运行在foreground和正在接收事件
  • Background:运行在background和正在执行代码
  • Suspended:运行在background但没有执行代码

切换状态如图所示:

大多数发生状态转换时都会调用delegate对象对应的方法来响应app的状态改变。下面汇总了delegate对象的所有方法,当app状态发生转换时,你可能会使用到它们。

1、application
didFinishLaunchingWithOptions:当应用程序启动时执行,应用程序启动入口,只在应用程序启动时执行一次。若用户直接启动,lauchOptions内无数据,若通过其他方式启动应用,
lauchOptions包含对应方式的内容。

 2、applicationWillResignActive:在应用程序将要由活动状态切换到非活动状态时候,要执行的委托调用,如
按下 home 按钮,返回主屏幕,或全屏之间切换应用程序等。

 3、applicationDidEnterBackground:在应用程序已进入后台程序时,要执行的委托调用。

 4、applicationWillEnterForeground:在应用程序将要进入前台时(被激活),要执行的委托调用,刚好与applicationWillResignActive
方法相对应。

 5、applicationDidBecomeActive:在应用程序已被激活后,要执行的委托调用,刚好与applicationDidEnterBackground 方法相对应。

 6、applicationWillTerminate:在应用程序要完全推出的时候,要执行的委托调用,这个需要要设置UIApplicationExitsOnSuspend的键值。 

应用程序的架构

相信大家都很熟悉MVC,iOS应用程序现在大多都遵循Model-View-Controller的架构。

Model负责存储数据和处理业务逻辑,View负责显示数据和与用户交互,Controller是两者的中介,协调Model和View相互协作。(点击查看 Model数据层解析Controller逻辑层解析

它们的通讯规则如下:

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

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

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

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

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

  • UIApplication对象

1

每一个iPhone程序都包含唯一一个UIApplication对象,它管理整个程序的生命周期,从加载第一个显示界面开始,并且监听系统事件、程序事件调度整个程序的执行。

UIApplication的核心作用是提供了iOS程序运行期间的控制和协作工作。用户与iOS设备交互时产生的事件(Multitouch Events,Motion Event,Remote Control Event)交由UIApplication对象来分发给control objects(UIControl)对应的target
objects来处理并且管理整个事件循环也就是当需要处理用户事件时,它会起一个队列,把所有用户事件都放入队列,逐个处理,在处理的时候,它会发送当前事件 到一个合适的处理事件的目标控件。而一些关于app运行时重要事件委托给app delegate来处理(点击查看
UIApplication详情)

  • App delegate对象

2

实际上App delegate是遵循了UIApplicationDelegate协议的类,UIApplicationDelegate协议定义了很多和Application状态、消息相关的方法。您可以简单的理解为Application和系统的一个联系。在创建project的时候,Xcode会自动为您生成一个AppDelegate类。并在程序运行起来的时候创建AppDelegate对象(方式是通过UIApplicationMain的方法,在main.m文件中,这个就是App的入口函数)。这样在App运行过程中,就会调用AppDelegate中的方法。它响应app运行时重要事件(app启动、app内存不足、app终止、切换到另一个app、切回app),主要用于app在启动时初始化一些重要数据结构;例如,初始化UIWindow,设置一些属性,为window添加rootViewController。

  • View controller对象

3

viewController,是Xcode为您提供的一个视图控制器。您可以在其中实现相关的逻辑。View Controller有一个view属性是view层次结构中的根view,你可以添加子view来构建复杂的view;controller有一些viewDidLoad、viewWillAppear等方法来管理view的生命周期;由于它继承UIResponder,所有还会响应和处理用户事件。

  • UIWindow对象

4

UIWindow类是UIView的子类,可以看作是特殊的UIView。UIWindow对象是所有UIView的根视图,管理和协调的应用程序的显示、分发事件给View。它位于view层次结构中的最顶层,它充当一个基本容器而不显示内容,如果想显示内容,添加一个content view到window。它继承UIResponder,所以会响应和处理用户事件。一般应用程序只有一个UIWindow对象,即使有多个UIWindow对象,也只有一个UIWindow可以接受到用户的触屏事件。UIWindow初始化在appDeleDgate里面的
didFinishLaunchingWithOptions方法。

  • View对象

5

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

  • Control、Layer对象

6

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

如果我们想要构建view层次结构来影响app外观的话,除了view和control对象,还可以使用Core Animation框架的Layer对象来渲染view外观和构建复杂的动画。

UIKit中的控件包含了layer这个属性,对于view来说,它是其用来存储视图属性值的对象,我们对它进行动画操作时,改变了视图的属性值,layer将这些改变传递给硬件,硬件再进行绘图,相比于drawrect,它能够有效的减轻CPU的负荷。

  • Responder

7

Responder是UIKit框架封装的一个对象类型,它可以响应并处理事件。所有Responder对象的基类都是UIResponder。

下面我们来通过一张类图看看哪些对象具有Responder特性

从上图可以看出,UIApplication、UIViewController和UIView都是UIResponder对象,都具有对事件进行响应,处理的能力。

  • Main Run Loop

8

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

下图是main run loop的架构和用户事件被应用程序处理的过程。

当用户与设备交互时,系统就会生成与交互关联的事件,然后被应用程序的UIKit通过一个特殊的端口来分发。应用程序把事件放入队列,然后逐个分发到main run loop来执行。UIApplication对象是第一个对象接收到事件,然后决定怎样处理它。一个touch event通常都被分发到main window对象,然后依次分发到发生触碰的view。其他event的接收事件对象路径可能有点不同,大家可以深入了解一下事件传递这个过程,会对此有比较深刻的理解。(点击查看事件传递详情)。

总结:

本文简单总结了iOS应用程序从启动到结束过程中有哪些关键对象在参与,以及相关的内容,希望能给大家带来些许帮助!

时间: 2024-10-11 07:31:19

iOS 应用程序生命周期中那些不可忽视的“存在”的相关文章

IOS应用程序生命周期

1.应用程序状态 1.1.Not running-未运行 程序没有启动 1.2.Inactive-未激活 程序在前台运行,不过没有接受到事件,在没有事件处理下程序同城停留在这个状态 1.3.Active-激活 程序在前台运行并且接受到了事件,这也是前台的一个正常的模式 1.4.Background-后台 程序在后台而且能执行代码,大多数程序进入这个状态后会在这个状态停留一会,时间到了之后会进入挂起状态,有的程序经过特殊的请求后可以长期处于Background状态 1.5.Suspended-挂起

[转]iOS应用程序生命周期(前后台切换,应用的各种状态)详解

转载地址:http://blog.csdn.net/totogo2010/article/details/8048652 iOS的应用程序的生命周期,还有程序是运行在前台还是后台,应用程序各个状态的变换,这些对于开发者来说都是很重要的. iOS系统的资源是有限的,应用程序在前台和在后台的状态是不一样的.在后台时,程序会受到系统的很多限制,这样可以提高电池的使用和用户体验. //开发app,我们要遵循apple公司的一些指导原则,原则如下: 1.应用程序的状态 状态如下: Not running

转:iOS应用程序生命周期(前后台切换,应用的各种状态)详解

iOS应用程序生命周期(前后台切换,应用的各种状态)详解 分类: iOS开发进阶2012-10-08 15:35 42691人阅读 评论(30) 收藏 举报 iosapplication任务animationtimerxcode 目录(?)[+] iOS的应用程序的生命周期,还有程序是运行在前台还是后台,应用程序各个状态的变换,这些对于开发者来说都是很重要的. iOS系统的资源是有限的,应用程序在前台和在后台的状态是不一样的.在后台时,程序会受到系统的很多限制,这样可以提高电池的使用和用户体验.

iOS iOS应用程序生命周期(前后台切换,应用的各种状态)详解

iOS应用程序生命周期(前后台切换,应用的各种状态)详解 http://blog.csdn.net/totogo2010/article/details/8048652

iOS 应用程序生命周期

刚买了关东升老师的ios书,来记录一下自己感觉有用的东西: 作为应用程序的委托对象,Appdeletage在应用程序的生命周期的不同阶段会调用不同的方法. 首先说一下ios应用的五中状态: Not Running (非运行状态)应用程序未运行或者已经终止 Inactive (前台非活动状态)应用程序进入前台状态,但是还不能接受事件处理 Active (前台活动状态)应用程序进入前台,能接受事件 Background (后台状态)应用程序进入后台,依然能够执行代码.如果有可执行代码就会继续执行,如

iOS应用程序生命周期(前后台切换,应用的各种状态)详解

原文链接 iOS的应用程序的生命周期,还有程序是运行在前台还是后台,应用程序各个状态的变换,这些对于开发者来说都是很重要的. iOS系统的资源是有限的,应用程序在前台和在后台的状态是不一样的.在后台时,程序会受到系统的很多限制,这样可以提高电池的使用和用户体验. //开发app,我们要遵循apple公司的一些指导原则,原则如下: 1.应用程序的状态 状态如下: Not running  未运行  程序没启动 Inactive          未激活        程序在前台运行,不过没有接收到

IOS应用程序生命周期的AppDelegate详解

IOS 中的 AppDelegate.m/h 文件是很重要的呢,因为它是对 Application 的整个生命周期进行管理的. 先明白,每个iPhone应用程序都有一个UIApplication,UIApplication是iPhone应用程序的开始并且负责初始化并显 示 UIWindow,并负责加载应用程序的第一个UIView到UIWindow窗体中.UIApplication的另一个任务是帮助管理应用程序的 生命 周期,而UIApplication通过一个名字为UIApplicationDe

【转】iOS应用程序生命周期(前后台切换,应用的各种状态)详解

iOS的应用程序的生命周期,还有程序是运行在前台还是后台,应用程序各个状态的变换,这些对于开发者来说都是很重要的. iOS系统的资源是有限的,应用程序在前台和在后台的状态是不一样的.在后台时,程序会受到系统的很多限制,这样可以提高电池的使用和用户体验. //开发app,我们要遵循apple公司的一些指导原则,原则如下: 1.应用程序的状态 状态如下: Not running  未运行  程序没启动 Inactive          未激活        程序在前台运行,不过没有接收到事件.在没

图解ios程序生命周期

图解ios程序生命周期 应用程序启动后状态有Active.Inactive.Background.Suspended.Not running这5种状态,几种状态的转换见下图: 在AppDelegate中实现app状态变化时的回调函数,在 app状态发生变化时,系统会执行相应回调: - (BOOL)application:(UIApplication *)application willFinishLaunchingWithOptions:(NSDictionary *)launchOptions