iOS UIApplication 与 UIApplicationDelegate 简介

status
category
date
summary
slug
icon
tags
password

从main函数说起

在一个Objective-C的iOS程序中,main函数是程序的入口,Xcode自动创建的main函数如下:
main函数创建并维护了一个自动释放池,并调用了UIApplicationMain函数。
UIApplicationMain函数的定义为:
参数解释:
  • argcaegv:分别是参数长度和参数列表,由main函数传递过来的。
  • principalClassNameUIApplication或其子类的类名,注意是类名,也就是字符串。
    • 如果传入nil,则由Info.plistNSPrincipalClass key指定。
    • 如果NSPrincipalClass key仍然没有指定,则使用UIApplication
  • delegateClassNameUIApplicationDelegate的类名,一般为@"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等词来描述当前进行到哪一步,可读性比较高。

总结

UIApplicationUIApplicationDelegate对象存在的意义,在于方便地从系统层面管理不同的App,就像UIViewController是为了在App层面更好地管理界面。
Loading...

© 刘口子 2018-2025