这是我参与「第四届青训营 」笔记创作活动的第11天
App 的入口 —— main 函数
main 函数中会初始化一个 UIApplication 实例以及一个 AppDelegate 代理
UIApplicationMain
main 函数中,关键方法为 UIApplicationMain,创建 application 对象,和 application 的代理,设置事件循环
AppDelegate
AppDelegate 对象实际上也是一个单例实例对象,在 App 推出前永远也不会被释放,AppDelegate 在程序启动时就不断跟踪 App 的状态变化,处理包括从其他应用跳转、启动应用、后台运行等动作。
AppDelegate 作为 App 的根对象,主要有以下功能:
- 在启动时运行用以初始化 App 的代码
- 响应App在各个生命周期状态的指定方法
- 接受推送通知或者本地通知启动 App 的情况
- 处理低内存警告
- 处理 App 的状态保存和恢复
- 响应由 App 处理的事件
- 处理数据的存储
App的生命周期
App 从启动到退出的过程中,iOS 应用程序不断从系统接收各种事件,如:用户点击了屏幕、用户点击了 Home 键,并对这些事件进行响应。接收事件是 UIApplication 对象的工作,但是,响应事件需要由程序员编写的代码来处理。为了理解事件响应需要在哪里处理,就必须对 iOS 应用程序的整个生命周期和事件周期有所了解。
一个App的生命周期包含了5种状态:
- Not Running
- Inactive
- Active
- Background
- Suspended
而 App 的生命周期,就是根据这些状态之间进行变化而在 UIApplicationDelegate 中响应的回调方法
最常用的回调方法分为以下7种:
application:willFinishLaunchingWithOptions: 在 App 启动时调用表示应用加载进程已经开始,常用来处理应用状态的存储和恢复application:didFinishLaunchingWithOptions: 表示 App 将从未运行状态进入运行状态,用于对App的初始化操作applicationDidBecomeActive: 当应用即将进入前台运行时调用applicationWillResignActive: 当应用即将进从前台退出时调用applicationDidEnterBackground: 当应用开始在后台运行的时候调用applicationWillEnterForeground: 当程序从后台将要重新回到前台(但是还没变成 Active 状态)时候调用applicationWillTerminate: 当前应用即将被终止,在终止前调用的函数。通常是用来保存数据和一些退出前的清理工作。如果应用当前处在 suspended,此方法不会被调用。 该方法最长运行时限为5秒,过期应用即被 kill 掉并且移除内存
UIKit
视图(UIView)与图层(CALayer)
iOS 中所有的视图都是由UIView的基类派生来的
UIView 可以处理触摸事件,可以支持基于 CoreGraphics 绘图,可以做仿射变换,或者做滑动或者渐变动画
CALayer 类被 UIView 所封装(iOS 上,在 macOS 上是被 NSView 所封装),CALayer 不处理用户的交互,他只负责管理子涂层位置,包含一些方法和属性用来做动画和变换
CALayer 不清楚具体响应链,不能响应事件
UIView 不能做,但 CALayer 可以做的:
- 阴影、圆角、带颜色边框
- 3D变换
- 非矩形范围
- 透明遮罩
- 多级非线性动画