一、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;
代碼實作和效果:


2)設定聯網訓示器的可見性
@property(nonatomic,getter=isnetworkactivityindicatorvisible) bool networkactivityindicatorvisible;
代碼和效果:
3)管理狀态欄
從ios7開始,系統提供了2種管理狀态欄的方式
a.通過uiviewcontroller管理(每一個uiviewcontroller都可以擁有自己不同的狀态欄).
在ios7中,預設情況下,狀态欄都是由uiviewcontroller管理的,uiviewcontroller實作下列方法就可以輕松管理狀态欄的可見性和樣式
狀态欄的樣式 - (uistatusbarstyle)preferredstatusbarstyle;
狀态欄的可見性 -(bool)prefersstatusbarhidden;


b.通過uiapplication管理(一個應用程式的狀态欄都由它統一管理)
如果想利用uiapplication來管理狀态欄,首先得修改info.plist的設定
代碼:


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代理來處理這些系統事件。
作用:當被打斷的時候,通知代理進入到背景。
每次建立完項目,都有個帶有“appdelegate”字眼的類,它就是uiapplication的代理,njappdelegate預設已經遵守了uiapplicationdelegate協定,已經是uiapplication的代理。
2.代理方法


應用程式一般有五個狀态:官方文檔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函數才傳回


系統入口的代碼和參數說明:
argc:系統或者使用者傳入的參數
argv:系統或使用者傳入的實際參數
1.根據傳入的第三個參數,建立uiapplication對象
2.根據傳入的第四個産生建立uiapplication對象的代理
3.設定剛剛建立出來的代理對象為uiapplication的代理
4.開啟一個事件循環(可以了解為裡面是一個死循環)這個時間循環是一個隊列(先進先出)先添加進去的先處理
ios程式啟動原理
四、程式啟動的完整過程
1.main函數
2.uiapplicationmain
* 建立uiapplication對象
* 建立uiapplication的delegate對象
3.delegate對象開始處理(監聽)系統事件(沒有storyboard)
* 程式啟動完畢的時候, 就會調用代理的application:didfinishlaunchingwithoptions:方法
* 在application:didfinishlaunchingwithoptions:中建立uiwindow
* 建立和設定uiwindow的rootviewcontroller
* 顯示視窗
3.根據info.plist獲得最主要storyboard的檔案名,加載最主要的storyboard(有storyboard)
* 建立uiwindow