天天看點

iOS開發UI篇—程式啟動原理和UIApplication

一、uiapplication

1.簡單介紹

(1)uiapplication對象是應用程式的象征,一個uiapplication對象就代表一個應用程式。

(2)每一個應用都有自己的uiapplication對象,而且是單例的,如果試圖在程式中建立一個uiapplication對象,那麼将報錯提示。

(3)通過[uiapplicationsharedapplication]可以獲得這個單例對象

(4) 一個ios程式啟動後建立的第一個對象就是uiapplication對象,且隻有一個(通過代碼擷取兩個uiapplication對象,列印位址可以看出位址是相同的)。

(5)利用uiapplication對象,能進行一些應用級别的操作

2.應用級别的操作示例:

1)設定應用程式圖示右上角的紅色提醒數字(如qq消息的時候,圖示上面會顯示1,2,3條新資訊等。)

@property(nonatomic) nsinteger applicationiconbadgenumber;

代碼實作和效果:

iOS開發UI篇—程式啟動原理和UIApplication
iOS開發UI篇—程式啟動原理和UIApplication
iOS開發UI篇—程式啟動原理和UIApplication

2)設定聯網訓示器的可見性

@property(nonatomic,getter=isnetworkactivityindicatorvisible) bool networkactivityindicatorvisible;

代碼和效果:

iOS開發UI篇—程式啟動原理和UIApplication

3)管理狀态欄

從ios7開始,系統提供了2種管理狀态欄的方式

a.通過uiviewcontroller管理(每一個uiviewcontroller都可以擁有自己不同的狀态欄).

在ios7中,預設情況下,狀态欄都是由uiviewcontroller管理的,uiviewcontroller實作下列方法就可以輕松管理狀态欄的可見性和樣式

狀态欄的樣式   - (uistatusbarstyle)preferredstatusbarstyle;

狀态欄的可見性  -(bool)prefersstatusbarhidden;

iOS開發UI篇—程式啟動原理和UIApplication
iOS開發UI篇—程式啟動原理和UIApplication

b.通過uiapplication管理(一個應用程式的狀态欄都由它統一管理)

如果想利用uiapplication來管理狀态欄,首先得修改info.plist的設定

iOS開發UI篇—程式啟動原理和UIApplication

代碼:

iOS開發UI篇—程式啟動原理和UIApplication
iOS開發UI篇—程式啟動原理和UIApplication

c.補充

既然兩種都可以對狀态欄進行管理,那麼什麼時候該用什麼呢?

如果狀态欄的樣式隻設定一次,那就用uiapplication來進行管理;

如果狀态欄是否隐藏,樣式不一樣那就用控制器進行管理。

uiapplication來進行管理有額外的好處,可以提供動畫效果。

4)openurl:方法

uiapplication有個功能十分強大的openurl:方法

- (bool)openurl:(nsurl*)url;

openurl:方法的部分功能有

打電話 uiapplication *app = [uiapplicationsharedapplication]; [app openurl:[nsurlurlwithstring:@"tel://10086"]];

發短信 [app openurl:[nsurlurlwithstring:@"sms://10086"]];

發郵件 [app openurl:[nsurlurlwithstring:@"mailto://[email protected]"]];

打開一個網頁資源 [app openurl:[nsurlurlwithstring:@"http://ios.itcast.cn"]];

打開其他app程式 openurl方法,可以打開其他app。

url補充:

url:統一資源定位符,用來唯一的表示一個資源。

url格式:協定頭://主機位址/資源路徑

網絡資源:http/ ftp等 表示百度上一張圖檔的位址 http://www.baidu.com/images/20140603/abc.png

本地資源:file:///users/apple/desktop/abc.png(主機位址省略)

二、uiapplication delegate

1.簡單說明

所有的移動作業系統都有個緻命的缺點:app很容易受到打擾。比如一個來電或者鎖屏會導緻app進入背景甚至被終止。

還有很多其它類似的情況會導緻app受到幹擾,在app受到幹擾時,會産生一些系統事件,這時uiapplication會通知它的delegate對象,讓delegate代理來處理這些系統事件。

作用:當被打斷的時候,通知代理進入到背景。

iOS開發UI篇—程式啟動原理和UIApplication

每次建立完項目,都有個帶有“appdelegate”字眼的類,它就是uiapplication的代理,njappdelegate預設已經遵守了uiapplicationdelegate協定,已經是uiapplication的代理。

iOS開發UI篇—程式啟動原理和UIApplication

2.代理方法

iOS開發UI篇—程式啟動原理和UIApplication
iOS開發UI篇—程式啟動原理和UIApplication

應用程式一般有五個狀态:官方文檔app.states

三、程式啟動原理

uiapplicationmain

main函數中執行了一個uiapplicationmain這個函數

intuiapplicationmain(int argc, char *argv[], nsstring *principalclassname, nsstring *delegateclassname);

argc、argv:直接傳遞給uiapplicationmain進行相關處理即可

principalclassname:指定應用程式類名(app的象征),該類必須是uiapplication(或子類)。如果為nil,則用uiapplication類作為預設值

delegateclassname:指定應用程式的代理類,該類必須遵守uiapplicationdelegate協定

uiapplicationmain函數會根據principalclassname建立uiapplication對象,根據delegateclassname建立一個delegate對象,并将該delegate對象指派給uiapplication對象中的delegate屬性

接着會建立應用程式的main runloop(事件循環),進行事件的處理(首先會在程式完畢後調用delegate對象的application:didfinishlaunchingwithoptions:方法)

程式正常退出時uiapplicationmain函數才傳回

iOS開發UI篇—程式啟動原理和UIApplication
iOS開發UI篇—程式啟動原理和UIApplication

系統入口的代碼和參數說明:

argc:系統或者使用者傳入的參數

argv:系統或使用者傳入的實際參數

1.根據傳入的第三個參數,建立uiapplication對象

2.根據傳入的第四個産生建立uiapplication對象的代理

3.設定剛剛建立出來的代理對象為uiapplication的代理

4.開啟一個事件循環(可以了解為裡面是一個死循環)這個時間循環是一個隊列(先進先出)先添加進去的先處理

ios程式啟動原理

iOS開發UI篇—程式啟動原理和UIApplication

四、程式啟動的完整過程

1.main函數

2.uiapplicationmain

* 建立uiapplication對象

* 建立uiapplication的delegate對象

3.delegate對象開始處理(監聽)系統事件(沒有storyboard)

* 程式啟動完畢的時候, 就會調用代理的application:didfinishlaunchingwithoptions:方法

* 在application:didfinishlaunchingwithoptions:中建立uiwindow

* 建立和設定uiwindow的rootviewcontroller

* 顯示視窗

3.根據info.plist獲得最主要storyboard的檔案名,加載最主要的storyboard(有storyboard)

* 建立uiwindow

繼續閱讀