成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

iOS應(yīng)用程序的生命周期

移動(dòng)開(kāi)發(fā)
iOS應(yīng)用程序一般都是由自己編寫(xiě)的代碼和系統(tǒng)框架(system frameworks)組成,系統(tǒng)框架提供一些基本infrastructure給所有app來(lái)運(yùn)行,而你提供自己編寫(xiě)的代碼來(lái)定制app的外觀和行為。因此,了解iOS infrastructure和它們?nèi)绾喂ぷ鲗?duì)編寫(xiě)app是很有幫助的。

iOS應(yīng)用程序一般都是由自己編寫(xiě)的代碼系統(tǒng)框架(system frameworks)組成,系統(tǒng)框架提供一些基本infrastructure給所有app來(lái)運(yùn)行,而你提供自己編寫(xiě)的代碼來(lái)定制app的外觀和行為。因此,了解iOS infrastructure和它們?nèi)绾喂ぷ鲗?duì)編寫(xiě)app是很有幫助的。

Main函數(shù)入口

所有基于C編寫(xiě)的app的入口都是main函數(shù),但iOS應(yīng)用程序有點(diǎn)不同。不同就是你不需要為iOS應(yīng)用程序而自己編寫(xiě)main函數(shù),當(dāng)你使用Xcode創(chuàng)建工程的時(shí)候就已經(jīng)提供了。除非一些特殊情況,否則你不應(yīng)該修改Xcode提供的main函數(shù)實(shí)現(xiàn)。示例代碼如下:

#import <UIKit/UIKit.h> #import "AppDelegate.h"  int main(int argc, char * argv[]) {     @autoreleasepool {         return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));     }  }

上面實(shí)例代碼中有一個(gè)很重要的函數(shù)UIApplicationMain,它主要是創(chuàng)建app的幾個(gè)核心對(duì)象來(lái)處理以下過(guò)程:

  1. 從可用Storyboard文件加載用戶(hù)界面
  2. 調(diào)用AppDelegate自定義代碼來(lái)做一些初始化設(shè)置
  3. 將app放入Main Run Loop環(huán)境中來(lái)響應(yīng)和處理與用戶(hù)交互產(chǎn)生的事件

應(yīng)用程序的架構(gòu)

iOS應(yīng)用程序都遵循Model-View-Controller的架構(gòu),Model負(fù)責(zé)存儲(chǔ)數(shù)據(jù)和處理業(yè)務(wù)邏輯,View負(fù)責(zé)顯示數(shù)據(jù)和與用戶(hù)交互,Controller是兩者的中介,協(xié)調(diào)ModelView相互協(xié)作。它們的通訊規(guī)則如下:

  1. Controller能夠訪問(wèn)ModelViewModelView不能互相訪問(wèn)

    MVC Communication - Reference from Stanford University.png

     

  2. 當(dāng)View與用戶(hù)交互產(chǎn)生事件時(shí),使用target-action方式來(lái)處理

    MVC Communication - Reference from Stanford University.png

     #p#

  3. 當(dāng)View需要處理一些特殊UI邏輯或獲取數(shù)據(jù)源時(shí),通過(guò)delegatedata source方式交給Controller來(lái)處理

    MVC Communication - Reference from Stanford University.png

     #p#

  4. Model不能直接與Controller通信,當(dāng)Model有數(shù)據(jù)更新時(shí),可以通過(guò)NotificationKVO (Key Value Observing)來(lái)通知Controller更新View

    MVC Communication - Reference from Stanford University.png 

了解iOS的MVC設(shè)計(jì)模式之后,我們從下圖來(lái)了解在MVC模式下iOS應(yīng)用程序有哪些關(guān)鍵對(duì)象以及它們職責(zé)主要是什么?

The Structure of an App.png

 

  • UIApplication對(duì)象
    用戶(hù)與iOS設(shè)備交互時(shí)產(chǎn)生的事件(Multitouch Events,Motion Event,Remote Control Event)交由UIApplication對(duì)象來(lái)分發(fā)給control objects(UIControl)對(duì)應(yīng)的target objects來(lái)處理并且管理整個(gè)事件循環(huán),而一些關(guān)于app運(yùn)行時(shí)重要事件委托給app delegate來(lái)處理。

  • App delegate對(duì)象
    App delegate對(duì)象遵循UIApplicationDelegate協(xié)議,響應(yīng)app運(yùn)行時(shí)重要事件(app啟動(dòng)、app內(nèi)存不足、app終止、切換到另一個(gè)app、切回app),主要用于app在啟動(dòng)時(shí)初始化一些重要數(shù)據(jù)結(jié)構(gòu);例如,初始化UIWindow,設(shè)置一些屬性,為window添加rootViewController

  • View controller對(duì)象
    View Controller有一個(gè)view屬性是view層次結(jié)構(gòu)中的根view,你可以添加子view來(lái)構(gòu)建復(fù)雜的view;controller有一些viewDidLoadviewWillAppear等方法來(lái)管理view的生命周期;由于它繼承UIResponder,所有還會(huì)響應(yīng)和處理用戶(hù)事件。

  • Documents和data model對(duì)象
    data model對(duì)象主要用來(lái)存儲(chǔ)數(shù)據(jù)。例如,餓了么app在搜索切換地址后,有歷史記錄搜索地址歷史,當(dāng)app下次啟動(dòng)時(shí),讀取和顯示搜索地址歷史。
    document對(duì)象(繼承UIDocument)用來(lái)管理一些或所有的data model對(duì)象。document對(duì)象并不是必須的,但提供一種方便的方式來(lái)分組屬于單個(gè)文件或多個(gè)文件的數(shù)據(jù)。

  • UIWindow對(duì)象
    UIWindow對(duì)象位于view層次結(jié)構(gòu)中的最頂層,它充當(dāng)一個(gè)基本容器而不顯示內(nèi)容,如果想顯示內(nèi)容,添加一個(gè)content view到window。
    它也是繼承UIResponder,所以它也是會(huì)響應(yīng)和處理用戶(hù)事件。

  • #p#

  • Viewcontrollayer對(duì)象
    View對(duì)象可以通過(guò)addSubview和removeFromSuperview 等方法管理view的層次結(jié)構(gòu),使用layoutIfNeeded和setNeedsLayout等方法布局view的層次結(jié)構(gòu),當(dāng)你發(fā)現(xiàn)系統(tǒng)提供view已經(jīng)滿(mǎn)足不了你想要的外觀需求時(shí),可以重寫(xiě)drawRect方法或通過(guò)layer屬性來(lái)構(gòu)造復(fù)雜的圖形外觀和動(dòng)畫(huà)。還有一點(diǎn),UIView也是繼承UIResponder,所以也能夠處理用戶(hù)事件
    Control對(duì)象通常就是處理特定類(lèi)型用戶(hù)交互的View,常用的有button、switch、text field等。
    除了使用ViewControl來(lái)構(gòu)建view層次結(jié)構(gòu)來(lái)影響app外觀之外,還可以使用Core Animation框架的Layer對(duì)象來(lái)渲染view外觀和構(gòu)建復(fù)雜的動(dòng)畫(huà)。

Main Run Loop

一個(gè)iOS應(yīng)用程序的main run loop主要作用是處理所有與用戶(hù)相關(guān)的事件。UIApplication對(duì)象在啟動(dòng)時(shí)就設(shè)置main run loop和使用它來(lái)處理事件和更新基于view的界面。正如它的名字顯示,main run loop是運(yùn)行在應(yīng)用程序的主線程。這樣就確保與接收到用戶(hù)相關(guān)的事件被有序地處理。

下圖顯示main run loop的架構(gòu)和用戶(hù)事件最終是怎樣被應(yīng)用程序處理。當(dāng)用戶(hù)與設(shè)備交互時(shí),系統(tǒng)就會(huì)生成與交互關(guān)聯(lián)的事件,然后被應(yīng)用程序的UIKit通過(guò)一個(gè)特殊的端口來(lái)分發(fā)。應(yīng)用程序把事件放入隊(duì)列,然后逐個(gè)分發(fā)到main run loop來(lái)執(zhí)行。UIApplication對(duì)象是***個(gè)對(duì)象接收到事件,然后決定怎樣處理它。一個(gè)touch event通常都被分發(fā)到main window對(duì)象,然后依次分發(fā)到發(fā)生觸碰的view。其他event的接收事件對(duì)象路徑可能有點(diǎn)不同。

Main Run Loop from Apple Document

 

大多數(shù)的事件通過(guò)使用main run loop來(lái)分發(fā),但有些不是。有些事件被發(fā)送到一個(gè)delegate對(duì)象或傳遞到你提供的block中。想了解更多如何處理大多數(shù)類(lèi)型的事件,其中包括touch、remote control、motion、accelerometer和gyroscopic等事件,請(qǐng)查閱Event Handle Guide for iOS

應(yīng)用程序的狀態(tài)和多任務(wù)

有時(shí)系統(tǒng)會(huì)從app一種狀態(tài)切換另一種狀態(tài)來(lái)響應(yīng)系統(tǒng)發(fā)生的事件。例如,當(dāng)用戶(hù)按下home鍵、電話(huà)打入、或其他中斷發(fā)生時(shí),當(dāng)前運(yùn)行的應(yīng)用程序會(huì)切換狀態(tài)來(lái)響應(yīng)。應(yīng)用程序的狀態(tài)有以下幾種:

App State from Apple Document

 #p#

  • Not running:app還沒(méi)運(yùn)行
  • Inactive:app運(yùn)行在foreground但沒(méi)有接收事件
  • Active:app運(yùn)行在foreground和正在接收事件
  • Background:運(yùn)行在background和正在執(zhí)行代碼
  • Suspended:運(yùn)行在background但沒(méi)有執(zhí)行代碼

大多數(shù)發(fā)生狀態(tài)轉(zhuǎn)換時(shí)都會(huì)調(diào)用delegate對(duì)象對(duì)應(yīng)的方法來(lái)響應(yīng)app的狀態(tài)改變。下面匯總了delegate對(duì)象的所有方法,當(dāng)app狀態(tài)發(fā)生轉(zhuǎn)換時(shí),你可能會(huì)使用到它們。

  • application:willFinishLaunchingWithOptions:- 這個(gè)方法是你在啟動(dòng)時(shí)的***次機(jī)會(huì)來(lái)執(zhí)行代碼
  • application:didFinishLaunchingWithOptions:- 這個(gè)方法允許你在顯示app給用戶(hù)之前執(zhí)行***的初始化操作
  • applicationDidBecomeActive:- app已經(jīng)切換到active狀態(tài)后需要執(zhí)行的操作
  • applicationWillResignActive:- app將要從前臺(tái)切換到后臺(tái)時(shí)需要執(zhí)行的操作
  • applicationDidEnterBackground:- app已經(jīng)進(jìn)入后臺(tái)后需要執(zhí)行的操作
  • applicationWillEnterForeground:- app將要從后臺(tái)切換到前臺(tái)需要執(zhí)行的操作,但app還不是active狀態(tài)
  • applicationWillTerminate:- app將要結(jié)束時(shí)需要執(zhí)行的操作

現(xiàn)在講下app啟動(dòng)、來(lái)回切換app和鎖屏?xí)r狀態(tài)的切換和調(diào)用對(duì)應(yīng)哪些delegate對(duì)象的方法:

  • app啟動(dòng)和active/inactive

    Launch and active/inactive from Apple WWDC 2011 Session

     


    如圖所示,當(dāng)app啟動(dòng)時(shí),首先由not running狀態(tài)切換到inactive狀態(tài),此時(shí)調(diào)用application:didFinishLaunchingWithOptions:方法;然后由inactive狀態(tài)切換到active狀態(tài),此時(shí)調(diào)用applicationDidBecomeActive:方法。

    Launch and active/inactive 2 from Apple WWDC 2011 Session

     

    當(dāng)app發(fā)生中斷時(shí),由active狀態(tài)切換到inactive狀態(tài),此時(shí)調(diào)用applicationWillResignActive:方法。

  • 來(lái)回切換app

    Switch from an app from Apple WWDC 2011 Session

     #p#

    如圖所示,當(dāng)切換到另一個(gè)app時(shí),由狀態(tài)active切換到inactive,此時(shí)調(diào)用applicationWillResignActive:方法;然后從inactive狀態(tài)切換到running狀態(tài),此時(shí)調(diào)用applicationDidEnterBackground:方法。

    Switch to an app from Apple WWDC 2011 Session

     


    而當(dāng)切換回本來(lái)的app時(shí),由running狀態(tài)切換到inactive狀態(tài),此時(shí)調(diào)用applicationWillEnterForeground:方法,然后由inactive狀態(tài)切換到active狀態(tài),調(diào)用applicationDidBecomeActive:方法。
  • 鎖屏

    Device lock from Apple WWDC 2011 Session

     


    如何所示,當(dāng)手機(jī)鎖屏?xí)r,由狀態(tài)active切換到inactive,此時(shí)調(diào)用applicationWillResignActive:;然后再由inactive狀態(tài)切換到running狀態(tài),此時(shí)調(diào)用applicationDidEnterBackground:方法。

    更多關(guān)于app狀態(tài)切換以及調(diào)用app delegate哪些方法,請(qǐng)觀看WWDC 2011 Session的session_320__adopting_multitasking_in_your_app視頻。

  • 應(yīng)用程序的終止

    系統(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)并且沒(méi)有暫停,系統(tǒng)會(huì)在應(yīng)用程序終止之前調(diào)用applicationWillTerminate:來(lái)保存用戶(hù)的一些重要數(shù)據(jù)以便下次啟動(dòng)時(shí)恢復(fù)到app原來(lái)的狀態(tài)。

    總結(jié)

    本文總結(jié)了iOS應(yīng)用程序從啟動(dòng)到結(jié)束過(guò)程中有哪些關(guān)鍵對(duì)象在參與,以及當(dāng)用戶(hù)與系統(tǒng)交互時(shí)產(chǎn)生事件時(shí),系統(tǒng)利用main run loop來(lái)管理事件循環(huán),決定將事件交給系統(tǒng)哪些對(duì)象處理和如何處理。而當(dāng)app啟動(dòng)、來(lái)回切換app和鎖屏?xí)r,app的狀態(tài)如何切換和調(diào)用對(duì)應(yīng)的哪些app delegate對(duì)象來(lái)處理。

責(zé)任編輯:倪明 來(lái)源: Sam_Lau
相關(guān)推薦

2009-06-24 10:34:39

JSF生命周期JSF應(yīng)用程序

2013-07-31 14:50:32

Windows PhoWP應(yīng)用程序生命周期

2014-07-11 11:09:10

App應(yīng)用程序生命周期

2011-07-20 15:58:58

iPhone 應(yīng)用程序 生命周期

2011-08-10 16:50:10

iPhone生命周期

2013-09-26 11:20:34

Informatica

2012-05-28 15:37:20

WP程序生命周期

2014-02-24 10:50:32

DevOps云應(yīng)用

2014-09-28 11:28:02

Android應(yīng)用程序生命周期

2025-04-28 01:22:00

2023-12-21 08:00:00

ChatGPT人工智能大型語(yǔ)言模型

2010-08-01 15:29:04

AndroidDalvik

2012-08-16 09:38:38

ASP.NET

2010-04-02 09:02:02

ASP.NET MVC

2011-03-21 09:45:52

Hello WorldObjective-C生命周期

2012-06-20 10:29:16

敏捷開(kāi)發(fā)

2013-07-29 05:11:38

iOS開(kāi)發(fā)iOS開(kāi)發(fā)學(xué)習(xí)類(lèi)的'生命周期'

2014-07-16 13:39:30

Windows Pho

2015-07-08 16:28:23

weak生命周期

2022-04-19 07:20:24

軟件開(kāi)發(fā)安全生命周期SSDLC應(yīng)用安全
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 精品欧美一区二区精品久久久 | 久久这里只有精品首页 | 成人精品一区二区三区中文字幕 | 欧美日韩在线一区二区 | 中文字幕人成乱码在线观看 | 日韩一区二区三区在线视频 | 欧美 日韩 亚洲91麻豆精品 | 午夜精品久久久久久久星辰影院 | 狠狠草视频 | 国产精品高清一区二区三区 | 欧美日韩网站 | 美国一级毛片a | av一级久久| 欧美在线播放一区 | 亚洲日本视频 | 精品中文在线 | 欧美一区免费 | 日本一区二区不卡视频 | 国产精品久久久久无码av | a毛片 | 一区视频 | 国产黄色大片 | 羞羞网站免费 | 男人午夜视频 | 亚洲欧美激情精品一区二区 | 中文字幕视频在线观看 | 欧美三级电影在线播放 | 午夜精品久久久久99蜜 | www国产亚洲精品 | 天天天天操 | 成人av免费在线观看 | 亚洲婷婷一区 | 国产精品毛片 | 久久久久99| 亚洲欧美激情国产综合久久久 | 国产日韩精品一区二区 | 欧美区在线 | jizz在线免费观看 | 国产一区精品在线 | 国产免费观看视频 | 特黄小视频 |