一、 iOS應用程式是如何啟動的: 1) main.m 中的 main 函數調用自動釋放池 (autorelease pool) 中的 UIApplicationMain 函數: @autoreleasepool { return UIApplicationMain(argc, argv, nil, ...
一、 iOS應用程式是如何啟動的:
- 查看main.m源文件
1) main.m
中的main
函數調用自動釋放池 (autorelease pool) 中的UIApplicationMain
函數:-
@autoreleasepool { return UIApplicationMain(argc, argv, nil, NSStringFromClass([HelloWorldAppDelegate class])); }
2)讓我們來看一下這段代碼
- @autoreleasepool:自動釋放池,在MRC(手動引用計數)機制下可用於管理記憶體,Xcode預設是在ARC(自動引用計數)機制下
- UIApplicationMain的四個參數
- argc:系統或用戶傳入的參數個數
- argv:系統或用戶傳入的實際參數
- principalClassName:指定應用程式的類名(app的象徵),該類必須是UIApplication類或子類。如果為nil,則用UIApplication類做預設值。
- delegateClassName:指定應用程式的代理類,該類必須遵守UIApplicationDelegate協議
- 這段代碼所做的事情:
調用
UIApplicationMain
創建了一個UIApplication
類的實例和一個應用程式委托的實例(在本例中,應用程式委托是HelloWorldAppDelegate
,由單一視圖模板提供)。應用程式委托的主要作用是提供呈現應用程式內容的視窗,在應用程式呈現之前,應用程式委托也執行一些配置任務。(委托是一種設計模式,在此模式中,一個對象代表另一個對象實現功能,或與另一個對象協調配合進行工作。)在 iOS 應用程式中,視窗對象為應用程式的可見內容提供容器,協助將事件傳遞到應用程式對象,協助應用程式對設備的擺放方向做出響應。視窗本身是不可見的。
調用
UIApplicationMain
也會掃描應用程式的Info.plist
文件。Info.plist
文件為信息屬性列表,即鍵和值配對的結構化列表,它包含應用程式的信息,例如名稱和圖標。
-
補充:
-
1.根據傳入的第三個參數創建UIApplication對象,負責監聽事件
2.根據傳入的第四個參數創建一個delegate對象,並將該對象設為UIApplicationd對象的代理,負責處理事件
3.接著會建立應用程式的Main Runloop(事件迴圈),這個事件迴圈是一個隊列(先進先出),進行事件的處理(首先會在程式完畢後調用delegate對象的application: didFinishLaunchingWithOptions:方法),程式正常退出時UIApplicationMain函數才返回
-
程式啟動的完整過程
//1.main函數
//2.UIApplicationMain
// 創建UIApplication對象
// 創建UIApplication的delegate對象
//3.delegate對象開始處理(監聽)系統事件(在沒有storyboard中的創建過程)
// 程式啟動完畢時,會調用代理的application:didFinishLaunchingWithOptions:方法
// 調用application:didFinishLaunchingWithOptions:方法創建UIWindow
// 創建和設置UIWindow的rootViewController
// 顯示視窗
//有storyboard中的創建過程
//3.根據Info.plist獲得最主要storyboard的文件名,載入最主要的storyboard
//創建UIWindow
// 創建和設置UIWindow的rootViewController
// 顯示視窗
二、查看屬性列表文件(Info.plist)
因為您已選取在項目中使用串聯圖,所以 Info.plist
文件還包含應用程式對象應該載入的串聯圖的名稱。
串聯圖包含對象、轉換以及連接的歸檔,它們定義了應用程式的用戶界面。
在“HelloWorld”應用程式中,串聯圖文件命名為 Main.storyboard
(請註意 Info.plist
文件只顯示這名稱的第一部分)。
應用程式啟動時,載入 Main.storyboard
,接著根據它對初始視圖控制器進行實例化。
視圖控制器是管理區域內容的對象;而初始視圖控制器是應用程式啟動時載入的第一個視圖控制器。
“HelloWorld”應用程式僅包含一個視圖控制器(具體來說就是 HelloWorldViewController
)。
現在,HelloWorldViewController
管理由單視圖提供的一個區域的內容。視圖是一個對象,
它在屏幕的矩形區域中繪製內容,並處理由用戶觸摸屏幕所引起的事件。一個視圖也可以包含其他視圖,這些視圖稱為分視圖。
當一個視圖添加了一個分視圖後,它被稱為父視圖,這個分視圖被稱為子視圖。
父視圖、其子視圖以及子視圖的子視圖(如有的話)形成一個視圖層次。一個視圖控制器只管理一個視圖層次。
註:“模型-視圖-控制器”(Model-View-Controller, MVC) 設計模式定義了應用程式對象的三種角色,
“HelloWorld”應用程式中的視圖和視圖控制器,體現了其中的兩種,而第三種為模型對象。
在 MVC 中,模型對象表示數據(例如日曆應用程式中的待辦事項或繪圖程式中的圖形),
視圖對象知道如何顯示模型對象所表示的數據,控制器對象充當模型和視圖的媒介。
三、查看串聯圖
串聯圖包括場景和過渡。場景代表視圖控制器,過渡則表示兩個場景之間的轉換。
因為“Single View”模板提供一個視圖控制器,應用程式中的串聯圖只包含一個場景,沒有過渡。畫布上指向場景左側的箭頭
是“initial scene indicator”(初始場景指示器),它標識出應用程式啟動時應該首先載入的場景(通常初始的場景就是初始視圖控制器)。
在畫布上看到的場景稱為“Hello World View Controller”,因為它是由 HelloWorldViewController
對象來管理的。
“Hello World ViewController”場景由一些項目組成,顯示在 Xcode 大綱視圖(在畫布和項目導航器之間的面板)。
現在,視圖控制器由以下項目組成:
一個第一響應器占位符對象(以橙色立方體表示)。
-
-
“first responder”是一個動態占位符,應用程式運行時,它應該是第一個接收各種事件的對象。這些事件包括以編輯為主的事件(例如輕按文本欄以調出鍵盤)、運動事件(例如搖晃設備)和操作消息(例如當用戶輕觸按鈕時該按鈕發出的消息)等等。本教程不會涉及第一響應器的任何操作。
-
名為 Exit 的占位符對象,用於展開序列。
預設情況下,當用戶使子場景消失時,該場景的視圖控制器展開(或返回)父場景——即轉換為該子場景的原來場景。不過,Exit 對象使視圖控制器能夠展開任意一個場景。
-
HelloWorldViewController
對象(以黃色球體內的淺色矩形表示) -
串聯圖載入一個場景時,會創建一個視圖控制器類的實例來管理該場景。
-
一個視圖,列在視圖控制器下方
-
(要在大綱視圖中顯示此視圖,您可能要打開“Hello World View Controller”旁邊的展示三角形)。
此視圖的白色背景就是在 Simulator 中運行該應用程式時所看到的背景。
-
註:應用程式的視窗對象在串聯圖中並未表示出來。
畫布上,場景下方的區域稱為場景台。現在,場景台顯示了視圖控制器的名稱,即“Hello World View Controller”。
其他時候,場景台可包含圖標,分別代表第一響應器、Exit 占位符對象和視圖控制器對象。