iOS应用程序的生命周期

by admin on 2019年2月11日

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

发表评论

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

网站地图xml地图