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
    Event,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
的兑现原理

发表评论

电子邮件地址不会被公开。 必填项已用*标注