iOS的生命周期

  • iOS应用程序一般都是由自己编写的代码和系统框架组成。系统框架提供了一些基本的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是两者的中介,协调Model和View相互协作。它们的通讯规则如下。
1.Controller能够访问Model和View,Model和View不能相互访问


2.当View与用户交互产生事件时,使用target-action方式来处理。

3.当View需要处理一些特殊UI逻辑或获取数据源时,通过delegate或data source方式交给Controller来处理


4.Model不能直接与Controller通信,当Model有数据更新时,可以通过Notification或KVO(Key Value Observing)来通知Controller更新View


了解iOS的MVC设计模式之后,我们从下图了解在NVC模式下iOS应用程序有哪些管家对象以及它们职责主要是什么?

  • UIApplication对象
    用户与iOS设备交互时产生的事件(Multitouch Events,Motion Event,Remote Control Event)交互由UIApplication对象来分给control objects(UIControl)对应的target objects来处理并且管理整个事件循环,而一些关于APP运行时重要事件委托给app delegate来处理

  • App delegate对象
    APP delegate 对象遵循UIApplication Delegate协议,响应app运行时重要事件(app启动,APP内存不足,APP终止,切换到另一个APP,切回APP),主要用于APP在启动时初始化一些重要数据结构;例如,初始化UIWindow,设置一些属性,为window添加rootViewController.

  • View controller对象
    View controller有一个view测你结构中的根view,你可以添加子view来构建复杂的view;Controller有一些viewDidLoad,viewWillAppear等方法来管理view的生命周期;由于它继承UIResponder,所有还会响应和处理用户事件。

  • Documentsdata model对象
    data model对象主要用来存储数据。例如,饿了么APP在搜索切换地址后,有历史记录搜索地址历史当APP下次启动时,读取和显示搜索地址历史。
    document对象(继承UIDocument)用来管理一些或所有的data model对象。document对象并不是必须的,但提供一种方便的方式来分组属于单个文件或多个文件的数据。

  • UIWindow对象
    UIWindow对象位于view层次结构中的最顶层,它充当一个基本容器而不显示内容,如果想显示内容,添加一个content view到window。
    它也是继承UIRsponder,所以它也是会响应和处理用户事件。

  • View,control,layer对象
    Vew对象可以通过addSubview和removeFromSuperview等方法管理view的层次结构,使用layoutSubviews,layoutifNeeded和setNeedsLayout等方法布局view的层次结构,当你发现系统提供view已经满足不了你想要的外观需求时,可以重写drawRect方法或通过layer属性来构造复杂的图形外观和动画。还有一点,UIView也是继承UIResponder,所以也能够处理用户事件。
    Control对象通常就是处理特定类型用户交互的View,常用的有button,switch,text field等。
    除了使用View和control来构建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 来分发,但是有些就不会。有些事件被发送到一个delegate对象或传递到你提供的block中。

应用程序的状态和多任务

有时系统会从APP一种状态切换到另一种状态响应系统发生的事件。例如,当用户按下Home键,电话打入或其他终端发生时,当前运行的应用程序会切换状态来响应。应用程序的状态有以下几种:

  • 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将要结束时需要执行的操作
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,189评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,577评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,857评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,703评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,705评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,620评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,995评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,656评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,898评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,639评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,720评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,395评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,982评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,953评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,195评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,907评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,472评论 2 342

推荐阅读更多精彩内容

  • iOS应用程序的生命周期 来源: Sam_Lau(@Sam_Lau_Dev ) 链接:http://www.jia...
    简简蜗牛阅读 329评论 0 1
  • 0. 引子 iOS应用程序一般都是由自己编写的代码和系统框架(system frameworks)组成,系统框架提...
    i爱吃土豆的猫阅读 534评论 0 0
  • iOS应用程序一般都是由自己编写的代码和系统框架(system frameworks)组成,系统框架提供一些基本i...
    Sam_Lau阅读 37,918评论 17 235
  • *面试心声:其实这些题本人都没怎么背,但是在上海 两周半 面了大约10家 收到差不多3个offer,总结起来就是把...
    Dove_iOS阅读 27,121评论 29 470
  • 在众多的经典日本动漫中,我只爱看哆啦A梦和名侦探柯南。 所以我现在用手绘的方式来表达一下自己的喜好! 哆啦A梦中,...
    kid3211阅读 308评论 0 1