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...