当前位置: 首页 > 科技观察

一个iOS应用的生命周期

时间:2023-03-15 15:28:29 科技观察

iOS应用一般由自己编写的代码和系统框架(systemframeworks)组成。系统框架为所有应用程序运行提供了一些基本的基础设施,你提供自己的代码来定制应用程序的外观和行为。因此,了解iOS基础架构及其工作原理对于编写应用程序非常有帮助。主函数入口所有基于C的应用程序都以主函数作为入口点,但iOS应用程序有点不同。不同的是,你不需要为iOS应用编写自己的main函数,在你使用Xcode创建项目的时候就已经提供了。除某些特殊情况外,您不应修改Xcode提供的主要功能实现。示例代码如下:#import#import"AppDelegate.h"intmain(intargc,char*argv[]){@autoreleasepool{returnUIApplicationMain(argc,argv,nil,NSStringFromClass([AppDelegate类]));上面的示例代码中有一个非常重要的函数UIApplicationMain,它主要创建app的几个核心对象来处理以下过程:从可用的Storyboard文件中加载用户界面,调用AppDelegate自定义代码做一些初始化设置将应用程序放入MainRunLoop环境中,以响应和处理用户交互产生的事件。应用程序的架构遵循模型-视图-控制器架构。Model负责存储数据和处理业务逻辑,View负责展示数据和与用户进行交互,Controller是两者之间的中介,协调Model和View之间的协作。它们的通信规则如下:Controller可以访问Model和View,Model和View不能互相访问。MVCCommunication-ReferencefromStanfordUniversity.png当View与用户交互产生事件时,使用target-action方式处理MVCCommunication-ReferencefromStanfordUniversity.png#p#当View需要处理一些特殊的UI逻辑或获取数据时sources,会通过delegate或者datasource交给Controller处理MVC通信-ReferencefromStanfordUniversity.png#p#Model不能直接和Controller通信,当Model有数据更新时,Controller可以通过Notification或KVO(KeyValueObserving)MVCCommunication-ReferencefromStanfordUniversity.png了解了iOS的MVC设计模式后,我们可以从下图了解MVC模式下的iOS有哪些关键对象他们的主要职责是什么?App.pngUIApplication对象的结构用户与iOS设备交互时产生的事件(MultitouchEvents、MotionEvent、RemoteControlEvent)由UIApplication对象分发到相应的控制对象(UIControl)的目标对象中去处理和管理整个事件循环,一些关于app运行时的重要事件委托给appdelegate去处理。Appdelegate对象Appdelegate对象遵循UIApplicationDelegate协议,响应app运行时的重要事件(app启动、app内存不足、app终止、切换到另一个app、切换回app),主要用于初始化App启动时的一些重要数据结构;比如初始化UIWindow,设置一些属性,给window添加rootViewController。视图控制器对象ViewController有一个view属性,它是视图层次结构中的根视图,你可以添加子视图来构建复杂的视图;controller有viewDidLoad、viewWillAppear等一些方法来管理view的生命周期;因为它继承了UIResponder,所有的也都响应和处理用户事件。文档和数据模型对象数据模型对象主要用于存储数据。例如饿了么APP在搜索和切换地址后,就有搜索地址历史的历史记录。下次启动该应用程序时,它将读取并显示搜索地址历史记录。文档对象(继承自UIDocument)用于管理部分或全部数据模型对象。文档对象不是必需的,但提供了一种方便的方法来对属于单个文档或多个文档的数据进行分组。UIWindow对象UIWindow对象位于视图层次结构的顶端,它作为一个不显示内容的基本容器,如果要显示内容,在窗口中添加一个内容视图。它还继承了UIResponder,因此它也会响应和处理用户事件。#p#View、control、layer对象View对象可以通过addSubview、removeFromSuperview等方法管理视图的层次结构,使用layoutIfNeeded、setNeedsLayout等方法对视图的层次结构进行布局。当你发现系统提供的view已经不能满足你想要的外观时,你可以重写drawRect方法或者使用layer属性来构造复杂的图形外观和动画。还有一点就是UIView也继承了UIResponder,所以它也可以处理用户事件。控制对象通常是处理特定类型用户交互的视图,例如按钮、开关和文本字段。除了使用View和Control构建视图层次结构来影响应用程序的外观外,您还可以使用CoreAnimation框架的Layer对象来渲染视图外观并构建复杂的动画。主运行循环iOS应用程序的主运行循环处理所有与用户相关的事件。UIApplication对象在启动时设置主运行循环,并使用它来处理事件和更新基于视图的界面。顾名思义,主运行循环是在应用程序上运行的主线程。这确保以有序的方式处理与接收到的用户相关的事件。下图显示了主运行循环的架构以及应用程序最终如何处理用户事件。当用户与设备交互时,系统会生成与交互关联的事件,然后由应用程序的UIKit通过特殊端口分派。应用程序将事件放入队列中,然后将它们一个一个分发到主运行循环中执行。UIApplication对象是第一个接收事件并决定如何处理它的对象。一个触摸事件通常分发给主窗口对象,然后依次分发给被触摸的视图。其他事件接收事件对象路径的方式可能略有不同。来自Apple文档的主运行循环大多数事件是使用主运行循环调度的,但有些不是。一些事件被发送到委托对象或传递到您提供的块。要了解有关如何处理大多数类型事件(包括触摸、远程控制、运动、加速度计和陀螺仪事件)的更多信息,请参阅iOS事件处理指南。应用程序状态和多任务处理有时系统会从一个应用程序状态切换到另一个应用程序状态以响应系统事件。例如,当用户按下主页按钮、有电话打进来或发生其他中断时,当前运行的应用程序会切换状态作为响应。应用的状态如下:AppStatefromAppleDocument#p#Notrunning:应用还没有运行Inactive:应用在前台运行,但没有接收到事件Active:应用在前台运行,正在接收事件Background:在后台运行并执行代码Suspended:在后台运行但不执行代码大多数状态转换都会调用delegate对象的相应方法来响应app的状态变化。下面总结了delegate对象的所有方法,您可能会在应用程序状态转换时使用这些方法。application:willFinishLaunchingWithOptions:-此方法是您第一次在启动时执行代码的机会active状态后执行applicationWillResignActive:-app即将从前台切换到后台时需要执行的操作当应用程序即将从后台切换到前台,但应用程序不处于活动状态时执行并在应用程序启动时调用相应的委托对象,在app和锁屏之间来回切换:appstartupandactive/inactiveLaunchandactive/inactivefromAppleWWDC2011Session如图,当app启动时,首先从notrunning状态切换到inactive状态,然后调用application:didFinishLaunchingWithOptions:方法;然后从inactive状态切换到active状态,然后调用applicationDidBecomeActive:方法。Launchandactive/inactive2fromAppleWWDC2011Session当app中断时,active状态切换到inactive状态,此时调用applicationWillResignActive:方法。来回切换appSwitchfromappfromAppleWWDC2011Session#p#如图所示,当切换到另一个app时,状态从active切换到inactive,此时调用了applicationWillResignActive:方法;然后从inactive状态切换到running状态,此时调用applicationDidEnterBackground:方法。从AppleWWDC2011Session切换到一个app切换回原来的app时,从running状态切换到inactive状态,调用applicationWillEnterForeground:方法,然后从inactive状态切换到active状态,调用applicationDidBecomeActive:方法.如AppleWWDC2011Session的Devicelock所示,当手机处于锁定状态时,状态由active切换为inactive,此时调用applicationWillResignActive:;然后状态由inactive切换为running,此时会调用applicationDidEnterBackground:方法。有关应用状态切换以及调用应用委托的方法的更多信息,请观看WWDC2011Session的session_320__adopting_multitasking_in_your_app视频。应用程序终止其他应用程序启动时,系统经常因内存不足而回收内存。需要终止应用程序,但有时会因为应用程序需要很长时间才能响应而终止。如果应用程序在后台运行并且没有被挂起,系统会在应用程序终止之前调用applicationWillTerminate:来保存用户的一些重要数据,以便在启动时恢复到应用程序的原始状态下次。总结本文总结了iOS应用程序从开始到结束的过程中涉及到哪些关键对象,以及当用户与系统交互时产生事件,系统使用主runloop来管理事件循环并决定哪些对象将事件交给系统处理,如何处理。以及app启动时,app和锁屏来回切换,app的状态如何切换,调用哪些appdelegate对象进行处理。