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

iOS應用程序的生命周期

移動開發(fā)
iOS應用程序一般都是由自己編寫的代碼和系統框架(system frameworks)組成,系統框架提供一些基本infrastructure給所有app來運行,而你提供自己編寫的代碼來定制app的外觀和行為。因此,了解iOS infrastructure和它們如何工作對編寫app是很有幫助的。

iOS應用程序一般都是由自己編寫的代碼系統框架(system frameworks)組成,系統框架提供一些基本infrastructure給所有app來運行,而你提供自己編寫的代碼來定制app的外觀和行為。因此,了解iOS infrastructure和它們如何工作對編寫app是很有幫助的。

Main函數入口

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

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

上面實例代碼中有一個很重要的函數UIApplicationMain,它主要是創(chuàng)建app的幾個核心對象來處理以下過程:

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

應用程序的架構

iOS應用程序都遵循Model-View-Controller的架構,Model負責存儲數據和處理業(yè)務邏輯,View負責顯示數據和與用戶交互,Controller是兩者的中介,協調ModelView相互協作。它們的通訊規(guī)則如下:

  1. Controller能夠訪問ModelViewModelView不能互相訪問

    MVC Communication - Reference from Stanford University.png

     

  2. View與用戶交互產生事件時,使用target-action方式來處理

    MVC Communication - Reference from Stanford University.png

     #p#

  3. View需要處理一些特殊UI邏輯或獲取數據源時,通過delegatedata source方式交給Controller來處理

    MVC Communication - Reference from Stanford University.png

     #p#

  4. Model不能直接與Controller通信,當Model有數據更新時,可以通過NotificationKVO (Key Value Observing)來通知Controller更新View

    MVC Communication - Reference from Stanford University.png 

了解iOS的MVC設計模式之后,我們從下圖來了解在MVC模式下iOS應用程序有哪些關鍵對象以及它們職責主要是什么?

The Structure of an App.png

 

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

  • App delegate對象
    App delegate對象遵循UIApplicationDelegate協議,響應app運行時重要事件(app啟動、app內存不足、app終止、切換到另一個app、切回app),主要用于app在啟動時初始化一些重要數據結構;例如,初始化UIWindow,設置一些屬性,為window添加rootViewController

  • View controller對象
    View Controller有一個view屬性是view層次結構中的根view,你可以添加子view來構建復雜的view;controller有一些viewDidLoadviewWillAppear等方法來管理view的生命周期;由于它繼承UIResponder,所有還會響應和處理用戶事件。

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

  • UIWindow對象
    UIWindow對象位于view層次結構中的最頂層,它充當一個基本容器而不顯示內容,如果想顯示內容,添加一個content view到window。
    它也是繼承UIResponder,所以它也是會響應和處理用戶事件。

  • #p#

  • Viewcontrollayer對象
    View對象可以通過addSubview和removeFromSuperview 等方法管理view的層次結構,使用layoutIfNeeded和setNeedsLayout等方法布局view的層次結構,當你發(fā)現系統提供view已經滿足不了你想要的外觀需求時,可以重寫drawRect方法或通過layer屬性來構造復雜的圖形外觀和動畫。還有一點,UIView也是繼承UIResponder,所以也能夠處理用戶事件
    Control對象通常就是處理特定類型用戶交互的View,常用的有button、switch、text field等。
    除了使用ViewControl來構建view層次結構來影響app外觀之外,還可以使用Core Animation框架的Layer對象來渲染view外觀和構建復雜的動畫。

Main Run Loop

一個iOS應用程序的main run loop主要作用是處理所有與用戶相關的事件。UIApplication對象在啟動時就設置main run loop和使用它來處理事件和更新基于view的界面。正如它的名字顯示,main run loop是運行在應用程序的主線程。這樣就確保與接收到用戶相關的事件被有序地處理。

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

Main Run Loop from Apple Document

 

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

應用程序的狀態(tài)和多任務

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

App State from Apple Document

 #p#

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

大多數發(fā)生狀態(tài)轉換時都會調用delegate對象對應的方法來響應app的狀態(tài)改變。下面匯總了delegate對象的所有方法,當app狀態(tài)發(fā)生轉換時,你可能會使用到它們。

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

現在講下app啟動、來回切換app和鎖屏時狀態(tài)的切換和調用對應哪些delegate對象的方法:

  • app啟動和active/inactive

    Launch and active/inactive from Apple WWDC 2011 Session

     


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

    Launch and active/inactive 2 from Apple WWDC 2011 Session

     

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

  • 來回切換app

    Switch from an app from Apple WWDC 2011 Session

     #p#

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

    Switch to an app from Apple WWDC 2011 Session

     


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

    Device lock from Apple WWDC 2011 Session

     


    如何所示,當手機鎖屏時,由狀態(tài)active切換到inactive,此時調用applicationWillResignActive:;然后再由inactive狀態(tài)切換到running狀態(tài),此時調用applicationDidEnterBackground:方法。

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

  • 應用程序的終止

    系統常常是為其他app啟動時由于內存不足而回收內存***需要終止應用程序,但有時也會是由于app很長時間才響應而終止。如果app當時運行在后臺并且沒有暫停,系統會在應用程序終止之前調用applicationWillTerminate:來保存用戶的一些重要數據以便下次啟動時恢復到app原來的狀態(tài)。

    總結

    本文總結了iOS應用程序從啟動到結束過程中有哪些關鍵對象在參與,以及當用戶與系統交互時產生事件時,系統利用main run loop來管理事件循環(huán),決定將事件交給系統哪些對象處理和如何處理。而當app啟動、來回切換app和鎖屏時,app的狀態(tài)如何切換和調用對應的哪些app delegate對象來處理。

責任編輯:倪明 來源: Sam_Lau
相關推薦

2009-06-24 10:34:39

JSF生命周期JSF應用程序

2013-07-31 14:50:32

Windows PhoWP應用程序生命周期

2014-07-11 11:09:10

App應用程序生命周期

2011-07-20 15:58:58

iPhone 應用程序 生命周期

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云應用

2014-09-28 11:28:02

Android應用程序生命周期

2025-04-28 01:22:00

2023-12-21 08:00:00

ChatGPT人工智能大型語言模型

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生命周期

2013-07-29 05:11:38

iOS開發(fā)iOS開發(fā)學習類的'生命周期'

2012-06-20 10:29:16

敏捷開發(fā)

2014-07-16 13:39:30

Windows Pho

2015-07-08 16:28:23

weak生命周期

2022-04-19 07:20:24

軟件開發(fā)安全生命周期SSDLC應用安全
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 91亚洲精选 | 欧洲国产精品视频 | 国产一区二区电影 | 日本网站在线看 | 一区二区在线不卡 | 伊伊综合网 | 色婷婷综合网站 | 国产色播av在线 | 天堂在线www | 国产精品免费视频一区 | 黄色大片视频 | 97精品国产 | 欧美激情视频一区二区三区在线播放 | 国产精品中文字幕在线 | 人人干人人干人人 | 国产大学生情侣呻吟视频 | 成人欧美一区二区三区在线播放 | 国产精品99久久久久久宅男 | 国产a区| 精品国产欧美一区二区三区成人 | 亚洲视频一区 | 九色91视频| 日日夜夜狠狠操 | 国产精品入口久久 | 亚洲成人免费 | 自拍偷拍亚洲一区 | 看a级黄色毛片 | 丁香婷婷综合激情五月色 | 国产精品成人一区二区三区夜夜夜 | 日韩精品无码一区二区三区 | 成人a网 | 精品久久久久久久久久久 | 精品久久影院 | 国产精品国产精品 | 国产成人高清在线观看 | 成人欧美一区二区 | 亚洲精品国产成人 | 日韩激情免费 | 欧美黄视频| 美日韩免费视频 | 久久成人免费视频 |