iOS应用程序的生命周期美学原理

总结

本文总括了iOS应用程序从启动至了过程遭到发出安首要目的在与,以及当用户和系统互相时起事件时,系统使用main
run
loop来治本事件循环,决定以事件交给系统如何对象处理与怎么处理。而当app启动、来回切换app和锁屏时,app的状态如何切换和调用对应之怎么app delegate靶来处理。

应用程序的状态与多任务

有时候系统会从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应用程序都随Model-View-Controller的架构,Model负责储存数据与处理事务逻辑,View背呈现数据以及和用户交互,Controller是二者的中介,协调ModelView相互协作。它们的报导规则如下:

  1. Controller可以访问Model美学原理,和ViewModelView无克相互访问

    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
    伊芙(Eve)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外观和构建复杂的动画片。

iOS应用程序一般仍旧由祥和编排的代码系统框架(system
frameworks)组成,系统框架提供有基本infrastructure给有app来运行,而若提供温馨编写的代码来定制app的外观及作为。由此,了然iOS
infrastructure和它们咋做事针对性编写app是蛮有帮忙的。

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 Programming Guide for
iOS

Developing iOS 7 App for iPhone and
iPad

深刻明白RunLoop
Objective-C Autorelease Pool
的落实原理

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条件受到来响应和拍卖和用户交互爆发的风波