iOS的生命周期 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不能相互访问

iOS的生命周期
iOS -> 视图的生命周期 与 应用程序的生命周期
 


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

iOS的生命周期
iOS -> 视图的生命周期 与 应用程序的生命周期
 

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

iOS的生命周期
iOS -> 视图的生命周期 与 应用程序的生命周期
 

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

iOS的生命周期
iOS -> 视图的生命周期 与 应用程序的生命周期
 


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

iOS的生命周期
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的接收事件对象路径可能有点不同。
iOS的生命周期
iOS -> 视图的生命周期 与 应用程序的生命周期
 

大多数的事件通过使用main run loop 来分发,但是有些就不会。有些事件被发送到一个delegate对象或传递到你提供的block中。

应用程序的状态和多任务

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

iOS的生命周期
iOS -> 视图的生命周期 与 应用程序的生命周期
 
  • 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将要结束时需要执行的操作



文/箫声_筱昇(简书作者)
原文链接:http://www.jianshu.com/p/550e5b1d4779
著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。
字数469 阅读153 评论0 

1、视图的生命周期

1、 alloc 创建对象,分配空间
2、 init (initWithNibName) 初始化对象,初始化数据
3、 loadView 从nib载入视图 ,除非你没有使用xib文件创建视图
4、 viewDidLoad 载入完成,可以进行自定义数据以及动态创建其他控件
5、 viewWillAppear视图将出现在屏幕之前,马上这个视图就会被展现在屏幕上了
6、 viewDidAppear 视图已在屏幕上渲染完成
7、viewWillDisappear 视图将被从屏幕上移除之前执行
8、viewDidDisappear 视图已经被从屏幕上移除,用户看不到这个视图了
9、dealloc 视图被销毁,此处需要对你在init和viewDidLoad中创建的对象进行释放.
10、viewVillUnload- 当内存过低,即将释放时调用;
11、viewDidUnload-当内存过低,释放一些不需要的视图时调用。

2、应用程序的生命周期

1,启动但还没进入状态保存 :
- (BOOL)application:(UIApplication *)application willFinishLaunchingWithOptions:(NSDictionary *)launchOptions 

2,基本完成程序准备开始运行:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

3,当应用程序将要入非活动状态执行,应用程序不接收消息或事件,比如来电话了:
- (void)applicationWillResignActive:(UIApplication *)application 

4,当应用程序入活动状态执行,这个刚好跟上面那个方法相反:
- (void)applicationDidBecomeActive:(UIApplication *)application   

5,当程序被推送到后台的时候调用。所以要设置后台继续运行,则在这个函数里面设置即可:
- (void)applicationDidEnterBackground:(UIApplication *)application  

6,当程序从后台将要重新回到前台时候调用,这个刚好跟上面的那个方法相反:
- (void)applicationWillEnterForeground:(UIApplication *)application  

7,当程序将要退出是被调用,通常是用来保存数据和一些退出前的清理工作:
- (void)applicationWillTerminate:(UIApplication *)application