iOS的生命周期
- iOS應用程序一般都是由自己編寫的代碼和系統框架組成。系統框架提供了一些基本的infrastructure給APP來運行,而開發者則自己編寫代碼定制APP的外觀和行為,了解iOS infrastructure及其如何工作對編寫APP很有幫助。
Main函數入口
所有基于C編寫的APP的入口都是main函數,但iOS應用程序有點不同。不同就是你不需要為iOS應用程序而編寫main函數,當你使用Xcode創建工程的時候就已經提供了。除非一些特殊情況,否則你不應該修改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,它主要是創建APP的幾個核心對象來處理一下過程:
1,從 可用Storyboard文件加載用戶界面;
2,調用APPDelegate自定義代碼來做一些初始化設置
3.強將APP放入Main Run Loop環境中來影響和處理與用戶交互產生的事件。
應用程序的架構。
iOS的應用程序都遵循Model-View-Controller的架構,Model負責存儲數據和處理業務邏輯,View負責顯示數據和用戶交互,Controller是兩者的中介,協調Model和View相互協作。它們的通訊規則如下。
1.Controller能夠訪問Model和View,Model和View不能相互訪問
2.當View與用戶交互產生事件時,使用target-action方式來處理。
3.當View需要處理一些特殊UI邏輯或獲取數據源時,通過delegate或data source方式交給Controller來處理
4.Model不能直接與Controller通信,當Model有數據更新時,可以通過Notification或KVO(Key Value Observing)來通知Controller更新View
了解iOS的MVC設計模式之后,我們從下圖了解在NVC模式下iOS應用程序有哪些管家對象以及它們職責主要是什么?
- UIApplication對象
用戶與iOS設備交互時產生的事件(Multitouch Events,Motion Event,Remote Control Event)交互由UIApplication對象來分給control objects(UIControl)對應的target objects來處理并且管理整個事件循環,而一些關于APP運行時重要事件委托給app delegate來處理 - App delegate對象
APP delegate 對象遵循UIApplication Delegate協議,響應app運行時重要事件(app啟動,APP內存不足,APP終止,切換到另一個APP,切回APP),主要用于APP在啟動時初始化一些重要數據結構;例如,初始化UIWindow,設置一些屬性,為window添加rootViewController. - View controller對象
View controller有一個view測你結構中的根view,你可以添加子view來構建復雜的view;Controller有一些viewDidLoad,viewWillAppear等方法來管理view的生命周期;由于它繼承UIResponder,所有還會響應和處理用戶事件。 -
Documents和data model對象
data model對象主要用來存儲數據。例如,餓了么APP在搜索切換地址后,有歷史記錄搜索地址歷史當APP下次啟動時,讀取和顯示搜索地址歷史。
document對象(繼承UIDocument)用來管理一些或所有的data model對象。document對象并不是必須的,但提供一種方便的方式來分組屬于單個文件或多個文件的數據。 -
UIWindow對象
UIWindow對象位于view層次結構中的最頂層,它充當一個基本容器而不顯示內容,如果想顯示內容,添加一個content view到window。
它也是繼承UIRsponder,所以它也是會響應和處理用戶事件。 - View,control,layer對象
Vew對象可以通過addSubview和removeFromSuperview等方法管理view的層次結構,使用layoutSubviews,layoutifNeeded和setNeedsLayout等方法布局view的層次結構,當你發現系統提供view已經滿足不了你想要的外觀需求時,可以重寫drawRect方法或通過layer屬性來構造復雜的圖形外觀和動畫。還有一點,UIView也是繼承UIResponder,所以也能夠處理用戶事件。
Control對象通常就是處理特定類型用戶交互的View,常用的有button,switch,text field等。
除了使用View和control來構建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通過一個特殊的端口來分發。應用程序把事件放入隊列,然后逐個分發到main run loop來執行。UIApplication對象是第一個對象接收事件,然后決定怎樣處理它。一個touch event通常都被分發到main window對象,然后依次分發到發生觸碰的view。其它event的接收事件對象路徑可能有點不同。
大多數的事件通過使用main run loop 來分發,但是有些就不會。有些事件被發送到一個delegate對象或傳遞到你提供的block中。
應用程序的狀態和多任務
有時系統會從APP一種狀態切換到另一種狀態響應系統發生的事件。例如,當用戶按下Home鍵,電話打入或其他終端發生時,當前運行的應用程序會切換狀態來響應。應用程序的狀態有以下幾種:
- Not running:APP還沒運行
- Inactive:APP運行在foreground但沒有接收事件
- Active: APP運行在foreground和正在接收事件
- Background:運行在background和正在運行代碼
- Suspended:運行在background但沒有執行代碼
大多數發生狀態轉換時都會調用delegate對象對應的方法響應APP的狀態改變。下面匯總了delegate對象的所有方法,當APP狀態發生轉換時,你可能會使用到它們
- application:willFinishLaunchingWithOptions: - 這個方法是你在啟動時的第一次機會來執行代碼
- application:didFinishLaunchingWithOptions:- 這個方法允許你在現實APP給用戶之前執行最后的初始化操作;
- applicationDidBecomeActive:- app已經切換到active狀態后需要執行的操作。
- applicationWillResignActive:- app江陽從前臺切換到后臺需要時執行的操作
- applicationDidEnterBackground:- app已經進入后臺后需要執行的操作
- applicationWillEnterForeground:- APP將要從后臺切換到前臺需要執行的操作,但APP還不是active狀態
- applicationWillTerminate:- app將要結束時需要執行的操作
原文鏈接:http://www.jianshu.com/p/550e5b1d4779
著作權歸作者所有,轉載請聯系作者獲得授權,并標注“簡書作者”。
iOS -> 視圖的生命周期 與 應用程序的生命周期
字數469?閱讀153?評論0?喜歡51、視圖的生命周期
1、 alloc 創建對象,分配空間 2、 init (initWithNibName) 初始化對象,初始化數據 3、 loadView 從nib載入視圖 ,除非你沒有使用xib文件創建視圖 4、 viewDidLoad 載入完成,可以進行自定義數據以及動態創建其他控件 5、 viewWillAppear視圖將出現在屏幕之前,馬上這個視圖就會被展現在屏幕上了 6、 viewDidAppear 視圖已在屏幕上渲染完成 7、viewWillDisappear 視圖將被從屏幕上移除之前執行 8、viewDidDisappear 視圖已經被從屏幕上移除,用戶看不到這個視圖了 9、dealloc 視圖被銷毀,此處需要對你在init和viewDidLoad中創建的對象進行釋放. 10、viewVillUnload- 當內存過低,即將釋放時調用; 11、viewDidUnload-當內存過低,釋放一些不需要的視圖時調用。2、應用程序的生命周期
1,啟動但還沒進入狀態保存 : - (BOOL)application:(UIApplication *)application willFinishLaunchingWithOptions:(NSDictionary *)launchOptions 2,基本完成程序準備開始運行: - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 3,當應用程序將要入非活動狀態執行,應用程序不接收消息或事件,比如來電話了: - (void)applicationWillResignActive:(UIApplication *)application 4,當應用程序入活動狀態執行,這個剛好跟上面那個方法相反: - (void)applicationDidBecomeActive:(UIApplication *)application 5,當程序被推送到后臺的時候調用。所以要設置后臺繼續運行,則在這個函數里面設置即可: - (void)applicationDidEnterBackground:(UIApplication *)application 6,當程序從后臺將要重新回到前臺時候調用,這個剛好跟上面的那個方法相反: - (void)applicationWillEnterForeground:(UIApplication *)application 7,當程序將要退出是被調用,通常是用來保存數據和一些退出前的清理工作: - (void)applicationWillTerminate:(UIApplication *)application轉載于:https://www.cnblogs.com/tangyuanby2/p/6108531.html
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
- 上一篇: Google C++单元测试框架Goog
- 下一篇: 转:华为副总裁一封信:透露年薪千万的工作