iOS-AppDelegate和UIViewController
简述
AppDelegate和ViewController的生命周期在iOS中是非常重要的内容,它们贯穿了整个应用程序的生命周期,不同生命周期有包含了很多方法,我们根据产品需求分析不同情况中实现不同功能。
AppDelegate的生命周期
在创建一个iOS工程后,会自动创建一个AppDelegate类,它继承了UIResponder类,并且遵守了UIApplicationDelegate协议。在这个类中实现了一系列的UIApplicationDelegate的协议方法。下面是对AppDelegate生命周期中一些常用方法的介绍:
- application
程序启动成功后会调用的方法
iOS程序真正的入口,设置首页:
internal func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
//搭建UI界面,请求数据、展示数据
window = UIWindow(frame: UIScreen.main.bounds)
window?.backgroundColor = UIColor.red
window?.rootViewController = UTabBarController()
window?.makeKeyAndVisible()
return true
}
- applicationWillResignActive
程序将变成非活跃状态时调用的方法
比如按home键让程序在后台运行、来电可以将应用程序变成非活跃状态。
func applicationWillResignActive(_ application: UIApplication) {
//一般在这里关闭定时器、暂停视频/音频、暂停游戏。。。
print("已经进入后台-applicationWillResignActive")
}
- applicationDidEnterBackground
程序进入后台时调用的方法
func applicationDidEnterBackground(_ application: UIApplication) {
print("已经进入后台-applicationDidEnterBackground")
}
- applicationWillEnterForeground
程序将进入前台时调用的方法
func applicationWillEnterForeground(_ application: UIApplication) {
//根据情况去开启定时器、继续播放视频/音频、继续游戏。。。。
print("将要进入前台-applicationWillEnterForeground")
}
- applicationDidBecomeActive
程序恢复活跃状态时调用的方法
从后台回到前台、来电打断结束(挂机)就会从非活跃状态变成活跃状态。
func applicationDidBecomeActive(_ application: UIApplication) {
//根据情况去开启定时器、继续播放视频/音频、继续游戏。。。。
print("已经变成活跃状态-applicationDidBecomeActive")
}
- applicationWillTerminate
程序将要终止时调用的方法
一般情况,只有从后台强制将应用程序退出的时候,程序才会终止。
func applicationWillTerminate(_ application: UIApplication) {
//让应用程序不能后台运行:在info.plist文件中加添key为"Application does not run in background",值为YES的键值对
print("程序将要终止-applicationWillTerminate")
}
- applicationDidReceiveMemoryWarning
程序接收到内存警告的时候会自动调用的方法
func applicationDidReceiveMemoryWarning(_ application: UIApplication) {
//销毁一些不必要的内存。一般在这儿去释放一些缓存数据
print("接收到内存警告-applicationDidReceiveMemoryWarning")
}
ViewController的生命周期
ViewController的生命周期过程如图所示:
image.png
-
init
如果通过xib或storyboard创建,会首先调用该方法 -
loadView
当view需要被展示而它却是nil时,viewController会调用该方法。如果代码维护View的话需要重写此方法,使用xib维护View的话不用重写。
override func loadView() {
super.loadView()
//创建比较关键的view
print("loadView")
}
- viewDidLoad
执行完loadView后继续执行viewDidLoad,在viewDidLoad中最适合创建一些附加的view和控件。
override func viewDidLoad() {
super.viewDidLoad()
//创建一些附加view和控件
print("viewDidLoad")
loadData(false)
}
- viewWillApper
将显示在屏幕之前调用,在这个方法中可以进行一些显示前的处理,如:弹出键盘、添加特殊的出场动画等。
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
//显示前的处理,比如弹出键盘、添加特殊的出场动画
print("viewWillAppear")
}
- viewDidApper
显示在界面上的时候会自动调用。如果在显示结束后还需要添加一些操作,可以在这个方法中进行添加。
override func viewDidAppear(_ animated: Bool) {
super.viewWillAppear(animated)
//界面显示后添加一些操作
print("viewDidAppear")
}
- viewWillDisapper
视图即将消失、被覆盖或者是被隐藏的时候调用。
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
//视图即将消失、被覆盖或者被隐藏时调用
print("viewWillDisappear")
}
- viewDidDisappear
视图已经消失、被覆盖、被隐藏的时候调用,用户已经看不到视图了。
override func viewDidDisappear(_ animated: Bool) {
super.viewDidDisappear(animated)
//视图已经消失、被覆盖、被隐藏的时候调用
print("viewDidDisappear")
}
- viewWillUnload
如果当前有能被释放的view,系统会调用viewWillUnload方法来释放view。
总结
loadView和viewDidLoad的区别就是,loadView时view还没有生成,viewDidLoad时,view已经生成了,loadView只会被调用一次,而viewDidLoad可能会被调用多次(View可能会被多次加载),当view被添加到其他view中之前,会调用viewWillAppear,之后会调用viewDidAppear。当view从其他view中移除之前,调用viewWillDisAppear,移除之后会调用viewDidDisappear。当view不再使用时,受到内存警告时,ViewController会将view释放并将其指向为nil。
ViewController的生命周期中各方法执行流程如下:
init—>loadView—>viewDidLoad—>viewWillApper—>viewDidApper—>viewWillDisapper—>viewDidDisapper—>viewWillUnload->viewDidUnload—>dealloc