iOS App和ViewController的生命周期

應(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ā)。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 0. 引子 iOS應(yīng)用程序一般都是由自己編寫的代碼和系統(tǒng)框架(system frameworks)組成,系統(tǒng)框架提...
    i愛吃土豆的貓閱讀 610評(píng)論 0 0
  • 生命周期 2、簡(jiǎn)述應(yīng)用生命周期 App啟動(dòng):當(dāng)App啟動(dòng)時(shí),首先由not running狀態(tài)切換到inactive...
    丶逐漸閱讀 953評(píng)論 3 6
  • iOS應(yīng)用程序的生命周期 來源: Sam_Lau(@Sam_Lau_Dev ) 鏈接:http://www.jia...
    簡(jiǎn)簡(jiǎn)蝸牛閱讀 364評(píng)論 0 1
  • iOS應(yīng)用程序一般都是由自己編寫的代碼和系統(tǒng)框架(system frameworks)組成,系統(tǒng)框架提供一些基本i...
    Sam_Lau閱讀 38,317評(píng)論 17 235
  • 今天是母親節(jié),是個(gè)值得慶祝的日子,祝我好媽媽們節(jié)日快樂,身體健康!我相信世界上沒有什么比母親對(duì)我們更好、更重要的人...
    楊_baec閱讀 402評(píng)論 0 1

友情鏈接更多精彩內(nèi)容