应用程序的状态
Not Running:app还没运行
Inactive:app运行在前台但没有接收事件 即将活跃
Active:app运行在前台和正在接收事件 活跃中
Background:运行在后台和正在执行代码 后台
Suspended:运行在后台但没有执行代码 挂起
AppDelegate中的方法
响应app运行时重要事件,状态之间的转换
程序第一次启动后执行 didFinishLaunchingWithOptions
程序将要失去焦点时执行 applicationWillResignActive
程序得到焦点时执行 applicationDidBecomeActive
程序进入后台执行 applicationDidEnterBackground
程序进入前台执行 applicationDidEnterForeground
程序即将退出时调用 applicationWillTerminate
程序发生内存警告的时候调用 applicationDidReceiveMemoryWarning
应用程序状态切换
启动一个App 从Not running -> inactive -> active
此时调用didFinishLaunchingWithOptions方法,然后inactive切换到active,切换完成调用applicationDidBecomeActive
当App发生中断时,由active状态切换到inactive状态,此时调用applicationWillResignActive方法
当切换App时,由状态active切换到inactive,此时调用applicationWillResignActive方法;然后从inactive状态切换到running状态,此时调用applicationDidEnterBackground方法。
而当切换回本来的app时,由running状态切换到inactive状态,此时调用applicationWillEnterForeground方法,然后由inactive状态切换到active状态,调用applicationDidBecomeActive方法。
当手机锁屏时,由状态active切换到inactive,此时调用applicationWillResignActive;然后再由inactive状态切换到running状态,此时调用applicationDidEnterBackground方法。
系统常常是为其他app启动时由于内存不足而回收内存最后需要终止应用程序,但有时也会是由于app很长时间才响应而终止。如果app当时运行在后台并且没有暂停,系统会在应用程序终止之前调用applicationWillTerminate来保存用户的一些重要数据以便下次启动时恢复到app原来的状态。
ViewController的生命周期
init
如果通过xib或storyboard创建,会首先调用该方法
loadView
此时VC还未初始化,可以重写该方法自定义控制器的View,若重写逻辑,就不能调用[super loadView]
viewDidLoad
在VC的生命周期中,只会被调用一次。此时view已经初始化好,可以做一些页面初始化任务,由于此时view的bounds尚未确定,所以不适合写frame类型的布局代码,但是给视图添加约束没有影响。
viewWillAppear
VC的视图将要出现时调用,可能会调用多次,适合做一些与视图相关联的任务,适合做一些与视图出现相关联的任务,例如改变状态栏的方向、风格。
viewWillLayoutSubviews
view的子视图即将布局,触发条件是
view 被添加到视图层次中
view 的 bounds 发生了改变
调用了 - setNeedsLayout方法
调用了 - layoutIfNeeded方法
viewDidLayoutSubviews
当 view 的子视图已经布局时,此方法会被调用,触发条件同上。
viewDidAppear
视图渲染完成后调用,与viewWillAppear配套使用。
viewWillDisappear
视图即将从屏幕中消失时触发。
viewDidDisappear
视图从屏幕中消失后触发。
dealloc
视图被销毁,此处需要对你在init和viewDidLoad中创建的对象进行释放
didReceiveMemoryWarning
内存警告