iOS应用程序的生命周期

iOS应用程序一般都是由友善编排的代码系统框架(system
frameworks)组成,系统框架提供部分基本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是双方的中介,协调ModelView相互合作。它们的广播发布规则如下:

  1. Controller可以访问ModelViewModelView不可能相互走访

    MVC Communication – Reference from Stanford University.png

  2. View与用户交互爆发事件时,使用target-action情势来处理

    MVC Communication – Reference from Stanford University.png

  3. View必要处理局地特殊UI逻辑或获取数据源时,通过delegatedata source主意提交Controller来处理

    MVC Communication – Reference from Stanford University.png

  4. Model不可能一向与Controller通信,当Model有数据更新时,能够通过NotificationKVO (Key Value Observing)来通知Controller更新View

    MVC Communication – Reference from Stanford University.png

询问iOS的MVC设计方式之后,大家从下图来询问在MVC方式下iOS应用程序有何样紧要目的以及它们职责第一是哪些?

The Structure of an App.png

  • UIApplication对象
    用户与iOS设备交互时爆发的风浪(Multitouch 伊夫nts,Motion
    伊芙nt,Remote Control 伊夫nt)交由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有局地viewDidLoadviewWillAppear等措施来治本view的生命周期;由于它继续UIResponder,所有还会响应和拍卖用户事件。

  • Documents和data
    model对象
    data
    model
    目的首要用来囤积数据。例如,饿了么app在搜寻切换地址后,有历史记录搜索地址历史,当app下次启动时,读取和体现搜索地址历史。
    document对象(继承UIDocument)用来管理一些或有所的data
    model对象。document对象并不是必须的,但提供一种便利的章程来分组属于单个文件或三个公文的多少。

  • UIWindow对象
    UIWindow目的位于view层次结构中的最顶层,它充当一个主导容器而不显得内容,假设想体现内容,添加一个content
    view到window。
    它也是持续UIResponder,所以它也是会响应和拍卖用户事件。

  • Viewcontrollayer对象
    View对象能够透过addSubview和removeFromSuperview
    等形式管理view的层次结构,使用layoutIfNeeded和setNeedsLayout等办法布局view的层次结构,当你发觉系统提供view已经满意不断你想要的外观需要时,可以重写drawRect方法或通过layer属性来布局复杂的图片外观和卡通。还有少数,UIView也是继承UIResponder,所以也可以处理用户事件
    Control目的平时就是拍卖特定类型用户交互的View,常用的有button、switch、text
    field等。
    除去行使ViewControl来构建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 from Apple Document

大部的事件经过运用main run
loop来散发,但有点不是。有些事件被发送到一个delegate对象或传递到你提供的block中。想打听越多如何处理一大半档次的风浪,其中囊括touch、remote
control、motion、accelerometer和gyroscopic等事件,请查阅Event Handle
Guide for
iOS

应用程序的情状和多义务

有时系统会从app一种境况切换另一种情况来响应系统爆发的风云。例如,当用户按下home键、电话打入、或任何中断暴发时,当前运行的应用程序会切换状态来响应。应用程序的场馆有以下两种:

App State from Apple Document

  • 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将要甘休时索要实践的操作

今日讲下app启动、来回切换app和锁屏时情形的切换和调用对应什么delegate对象的法子:

  • app启动和active/inactive

    Launch and active/inactive from Apple WWDC 2011 Session

如图所示,当app启动时,首先由`not running`状态切换到`inactive`状态,此时调用`application:didFinishLaunchingWithOptions:`方法;然后由`inactive`状态切换到`active`状态,此时调用`applicationDidBecomeActive:`方法。

Launch and active/inactive 2 from Apple WWDC 2011 Session

当app暴发搁浅时,由active事态切换来inactive状态,此时调用applicationWillResignActive:方法。

  • 来往切换app

    Switch from an app from Apple WWDC 2011 Session

如图所示,当切换到另一个app时,由状态`active`切换到`inactive`,此时调用`applicationWillResignActive:`方法;然后从`inactive`状态切换到`running`状态,此时调用`applicationDidEnterBackground:`方法。

Switch to an app from Apple WWDC 2011 Session

而当切换回本来的app时,由running动静切换来inactive气象,此时调用applicationWillEnterForeground:方法,然后由inactive事态切换来active状态,调用applicationDidBecomeActive:方法。

  • 锁屏

    Device lock from Apple WWDC 2011 Session

如何所示,当手机锁屏时,由状态`active`切换到`inactive`,此时调用`applicationWillResignActive:`;然后再由`inactive`状态切换到`running`状态,此时调用`applicationDidEnterBackground:`方法。

更多关于app状态切换以及调用app delegate什么措施,请观察WWDC 2011
Session的session_320__adopting_multitasking_in_your_app视频。

应用程序的终止

系统时常是为其余app启动时由于内存不足而回收内存最终索要为止应用程序,但奇迹也会是由于app很长日子才响应而偃旗息鼓。如若app当时运作在后台并且没有中断,系统会在应用程序终止以前调用applicationWillTerminate:来保存用户的一些主要数据以便下次启动时恢复生机到app原来的情事。

总结

正文统计了iOS应用程序从起步到为止进度中有何样重大目的在加入,以及当用户与系统相互时发出事件时,系统采纳main
run
loop来保管事件循环,决定将事件交给系统如何对象处理和什么处理。而当app启动、来回切换app和锁屏时,app的情状如何切换和调用对应的如何app delegate对象来拍卖。

恢宏阅读

App Programming Guide for
iOS

Developing iOS 7 App for iPhone and
iPad

深刻了解RunLoop
Objective-C Autorelease Pool
的完成原理

相关文章