iOS UIApplication 与 UIApplicationDelegate 简介
status
category
date
summary
slug
icon
tags
password
从main函数说起
在一个Objective-C的iOS程序中,
main函数是程序的入口,Xcode自动创建的main函数如下:main函数创建并维护了一个自动释放池,并调用了UIApplicationMain函数。UIApplicationMain函数的定义为:参数解释:
argc、aegv:分别是参数长度和参数列表,由main函数传递过来的。
principalClassName:UIApplication或其子类的类名,注意是类名,也就是字符串。- 如果传入
nil,则由Info.plist的NSPrincipalClass key指定。 - 如果
NSPrincipalClass key仍然没有指定,则使用UIApplication。
delegateClassName:UIApplicationDelegate的类名,一般为@"AppDelegate"。
虽然这个函数的返回类型被声明为
int,但实际上它并不会返回,除非程序被异常终止。例如用户通过HOME键或者全面屏手势返回桌面,应用就会被调到后台,并执行响应的代理方法。UIApplicationMain会根据第三个参数创建一个UIApplication类或其子类的对象,并开始接受事件。默认情况传入nil,也就是使用UIApplication。接着根据第四个参数创建一个UIApplicationDelegate对象作为应用的委托,它被用来管理与应用声明周期相关的事件。总的来说,
main函数通过UIApplicationMain函数创建了UIApplication对象和UIApplicationDelegate代理,并建立了一个事件循环机制来捕捉、处理用户的行为,这个过程由前面提到的两个对象来完成。UIApplication
iOS程序启动后创建的一个对象就是
UIApplication,它是一个单例,可以通过[UIApplication sharedApplication]方法获取。每一个程序在运行期间必须有、且只能有一个UIApplication对象,不同的App拥有不同的UIApplication对象,因此不难想象,它的主要工作是负责该应用程序的控制和协调工作。处理用户事件
UIApplication的一个主要工作就是处理用户事件,它会创建一个事件队列,将所有事件放入其中,并负责将每个事件发送至最合适处理该事件的目标控件,例如用户的点击事件会被交由某个特定的Button去处理。管理窗口
在
UIApplication中有以下声明:该数组包括了与App关联的所有
UIWindow实例,包括可见和不可见的,但不包括由系统创建和管理的窗口,例如状态栏窗口是与系统关联的。虽然数组中不包括状态栏窗口,但是可以通过系统提供的方法设置状态栏。持有窗口列表的意义在于,所有控件是基于窗口显示的,所以有了每一个
UIWindow对象,就可以接触到任何一个UIView对象。应用级别的操作
UIApplication可以在应用层与系统进行交互,例如设置桌面图标的角标提醒数字、设置状态栏、设置联网状态等等。UIApplicationDelegate
程序之间或者程序和系统之间需要进行交互,这时
UIApplication对象就会通知UIApplicationDelegate对象,让这个代理来处理系统事件。可以说,UIApplicationDelegate是App生命周期的管理者,App有三种状态:Active:程序在前台运行,正在接受事件
Inactive:程序在前台运行,但没有接受事件,在前后台过渡的过程中会进入此状态
Background:程序在后台运行
所谓生命周期周期,实际上就是在这几个状态中来回切换,默认创建的
AppDelegate.m中有以下几个方法:从有关启动流程和生命周期相关的方法命名可以看出,苹果比较喜欢使用Did、Will等词来描述当前进行到哪一步,可读性比较高。
总结
UIApplication和UIApplicationDelegate对象存在的意义,在于方便地从系统层面管理不同的App,就像UIViewController是为了在App层面更好地管理界面。Loading...