一屠阻、啟動完整過程
1.main函數(shù)main.m
2.UIApplicationMain
- 創(chuàng)建UIApplication對象
- 創(chuàng)建UIApplication的delegate對象
3.delegate對象開始處理(監(jiān)聽)系統(tǒng)事件(沒有storyboard)
- 程序啟動完畢的時候, 就會調用代理的:didFinishLaunchingWithOptions:方法
- 在application:didFinishLaunchingWithOptions:中創(chuàng)建UIWindow* 創(chuàng)建和設置UIWindow的rootViewController
- 顯示窗口
4.根據(jù)Info.plist獲得最主要storyboard的文件名,加載最主要的storyboard(有storyboard)
- 創(chuàng)建UIWindow
- 創(chuàng)建和設置UIWindow的rootViewController
- 顯示窗口
二灌侣、程序啟動原理
main函數(shù)中執(zhí)行了一個UIApplicationMain這個函數(shù)
int UIApplicationMain(int argc, char *argv[], NSString *principalClassName, NSString *delegateClassName);
argc堕战、argv:直接傳遞給UIApplicationMain進行相關處理即可
principalClassName:指定應用程序類名(app的象征),該類必須是UIApplication(或子類)庐冯。如果為nil,則用UIApplication類作為默認值
delegateClassName:指定應用程序的代理類,該類必須遵守UIApplicationDelegate協(xié)議
UIApplicationMain函數(shù)會根據(jù)principalClassName創(chuàng)建UIApplication對象,根據(jù)delegateClassName創(chuàng)建一個delegate對象五鲫,并將該delegate對象賦值給UIApplication對象中的delegate屬性
接著會建立應用程序的Main Runloop(事件循環(huán)),進行事件的處理(首先會在程序完畢后調用delegate對象的application:didFinishLaunchingWithOptions:方法)
程序正常退出時UIApplicationMain函數(shù)才返回
int main(int argc, char * argv[]){ @autoreleasepool {
/**
* argc: 系統(tǒng)或者用戶傳入的參數(shù)個數(shù)
* argv: 系統(tǒng)或者用戶傳入的實際參數(shù)
* 1.根據(jù)傳入的第三個參數(shù)創(chuàng)建UIApplication對象
* 2.根據(jù)傳入的第四個產生創(chuàng)建UIApplication對象的代理
* 3.設置剛剛創(chuàng)建出來的代理對象為UIApplication的代理
* 4.開啟一個事件循環(huán)
**/
return UIApplicationMain(argc, argv, @"UIApplication", @"YYAppDelegate"); }}
二岔擂、UIApplication
1位喂、簡介
- UIApplication對象是應用程序的象征浪耘,一個UIApplication對象就代表一個應用程序。
- 每一個應用都有自己的UIApplication對象塑崖,而且是單例的七冲,如果試圖在程序中新建一個UIApplication對象,那么將報錯提示规婆。
- 通過[UIApplication sharedApplication]可以獲得這個單例對象
- 一個iOS程序啟動后創(chuàng)建的第一個對象就是UIApplication對象澜躺,且只有一個(通過代碼獲取兩個UIApplication對象,打印地址可以看出地址是相同的)抒蚜。
- 利用UIApplication對象掘鄙,能進行一些應用級別的操作
2、應用級別的操作
1.設置應用程序圖標右上角的紅色提醒數(shù)字
@property(nonatomic) NSInteger applicationIconBadgeNumber;
2.設置聯(lián)網指示器的可見性
@property(nonatomic,getter=isNetworkActivityIndicatorVisible) BOOL networkActivityIndicatorVisible;
3.管理狀態(tài)欄
- 通過UIViewController管理
在iOS7中嗡髓,默認情況下操漠,狀態(tài)欄都是由UIViewController管理的,UIViewController可以輕松管理狀態(tài)欄的可見性和樣式(每一個UIViewController都可以擁有自己不同的狀態(tài)欄)饿这。
- (UIStatusBarStyle)preferredStatusBarStyle; //狀態(tài)欄的樣式
-(BOOL)prefersStatusBarHidden;//狀態(tài)欄的可見性
-
通過UIApplication管理(一個應用程序的狀態(tài)欄都由它統(tǒng)一管理)
//設置狀態(tài)欄是否隱藏
app.statusBarHidden=YES;
//設置狀態(tài)欄是否隱藏+動畫效果
[app setStatusBarHidden:YES withAnimation:UIStatusBarAnimationFade];
如果狀態(tài)欄需隱藏浊伙,樣式不一樣那就用UIViewController進行管理,UIApplication可以提供動畫效果长捧。
4.openURL (統(tǒng)一資源定位符)
打電話 UIApplication *app = [UIApplicationsharedApplication]; [app openURL:[NSURLURLWithString:@"tel://10086"]];
發(fā)短信 [app openURL:[NSURLURLWithString:@"sms://10086"]];
發(fā)郵件 [app openURL:[NSURLURLWithString:@"mailto://12345@qq.com"]];
打開一個網頁資源 [app openURL:[NSURLURLWithString:@"http://ios.itcast.cn"]];
打開其他app程序
URL格式:協(xié)議頭://主機地址/資源路徑
2嚣鄙、****UIApplication Delegate****
在app受到干擾時,會產生一些系統(tǒng)事件唆姐,這時UIApplication會通知它的delegate對象拗慨,讓delegate代理來處理這些系統(tǒng)事件。
啟動與代理: