應(yīng)用程序的狀態(tài)
- Not Running:app還沒運(yùn)行
- Inactive:app運(yùn)行在前臺(tái)但沒有接收事件 即將活躍
- Active:app運(yùn)行在前臺(tái)和正在接收事件 活躍中
- Background:運(yùn)行在后臺(tái)和正在執(zhí)行代碼 后臺(tái)
- Suspended:運(yùn)行在后臺(tái)但沒有執(zhí)行代碼 掛起
AppDelegate中的方法
響應(yīng)app運(yùn)行時(shí)重要事件,狀態(tài)之間的轉(zhuǎn)換
程序第一次啟動(dòng)后執(zhí)行 didFinishLaunchingWithOptions
程序?qū)⒁ソ裹c(diǎn)時(shí)執(zhí)行 applicationWillResignActive
程序得到焦點(diǎn)時(shí)執(zhí)行 applicationDidBecomeActive
程序進(jìn)入后臺(tái)執(zhí)行 applicationDidEnterBackground
程序進(jìn)入前臺(tái)執(zhí)行 applicationDidEnterForeground
程序即將退出時(shí)調(diào)用 applicationWillTerminate
程序發(fā)生內(nèi)存警告的時(shí)候調(diào)用 applicationDidReceiveMemoryWarning
應(yīng)用程序狀態(tài)切換
啟動(dòng)一個(gè)App 從Not running -> inactive -> active
此時(shí)調(diào)用didFinishLaunchingWithOptions方法,然后inactive切換到active,切換完成調(diào)用applicationDidBecomeActive
當(dāng)App發(fā)生中斷時(shí),由active狀態(tài)切換到inactive狀態(tài),此時(shí)調(diào)用applicationWillResignActive方法
當(dāng)切換App時(shí),由狀態(tài)active切換到inactive,此時(shí)調(diào)用applicationWillResignActive方法;然后從inactive狀態(tài)切換到running狀態(tài),此時(shí)調(diào)用applicationDidEnterBackground方法。
而當(dāng)切換回本來的app時(shí),由running狀態(tài)切換到inactive狀態(tài),此時(shí)調(diào)用applicationWillEnterForeground方法,然后由inactive狀態(tài)切換到active狀態(tài),調(diào)用applicationDidBecomeActive方法。
當(dāng)手機(jī)鎖屏?xí)r,由狀態(tài)active切換到inactive,此時(shí)調(diào)用applicationWillResignActive;然后再由inactive狀態(tài)切換到running狀態(tài),此時(shí)調(diào)用applicationDidEnterBackground方法。
系統(tǒng)常常是為其他app啟動(dòng)時(shí)由于內(nèi)存不足而回收內(nèi)存最后需要終止應(yīng)用程序,但有時(shí)也會(huì)是由于app很長(zhǎng)時(shí)間才響應(yīng)而終止。如果app當(dāng)時(shí)運(yùn)行在后臺(tái)并且沒有暫停,系統(tǒng)會(huì)在應(yīng)用程序終止之前調(diào)用applicationWillTerminate來保存用戶的一些重要數(shù)據(jù)以便下次啟動(dòng)時(shí)恢復(fù)到app原來的狀態(tài)。
iOS App基于MVC
View與用戶交互事件,通過Action-Target的方式來響應(yīng)View的事件。
當(dāng)View需要處理一些特殊UI邏輯或獲取數(shù)據(jù)源時(shí),通過delegate或data source方式交給Controller來處理。
Model的更新通過Notification和KVO來通知Controller更新View
ViewController的生命周期
init
如果通過xib或storyboard創(chuàng)建,會(huì)首先調(diào)用該方法
loadView
此時(shí)VC還未初始化,可以重寫該方法自定義控制器的View,若重寫邏輯,就不能調(diào)用[super loadView]
viewDidLoad
在VC的生命周期中,只會(huì)被調(diào)用一次。此時(shí)view已經(jīng)初始化好,可以做一些頁面初始化任務(wù),由于此時(shí)view的bounds尚未確定,所以不適合寫frame類型的布局代碼,但是給視圖添加約束沒有影響。
viewWillAppear
VC的視圖將要出現(xiàn)時(shí)調(diào)用,可能會(huì)調(diào)用多次,適合做一些與視圖相關(guān)聯(lián)的任務(wù),適合做一些與視圖出現(xiàn)相關(guān)聯(lián)的任務(wù),例如改變狀態(tài)欄的方向、風(fēng)格。
viewWillLayoutSubviews
view的子視圖即將布局,觸發(fā)條件是
- view 被添加到視圖層次中
- view 的 bounds 發(fā)生了改變
- 調(diào)用了 - setNeedsLayout方法
- 調(diào)用了 - layoutIfNeeded方法
viewDidLayoutSubviews
當(dāng) view 的子視圖已經(jīng)布局時(shí),此方法會(huì)被調(diào)用,觸發(fā)條件同上。
viewWillDisappear
視圖即將從屏幕中消失時(shí)觸發(fā)。
viewDidAppear
視圖從屏幕中消失后觸發(fā)。