ios 基礎(chǔ)篇一程序啟動(dòng)原理和UIApplication

一梗脾、UIApplication

1.簡單介紹

(1)UIApplication對(duì)象是應(yīng)用程序的象征,一個(gè)UIApplication對(duì)象就代表一個(gè)應(yīng)用程序繁涂。
(2)每一個(gè)應(yīng)用都有自己的UIApplication對(duì)象拱她,而且是單例的,如果試圖在程序中新建一個(gè)UIApplication對(duì)象扔罪,那么將報(bào)錯(cuò)提示秉沼。
(3)通過[UIApplication sharedApplication]可以獲得這個(gè)單例對(duì)象
(4) 一個(gè)iOS程序啟動(dòng)后創(chuàng)建的第一個(gè)對(duì)象就是UIApplication對(duì)象,且只有一個(gè)(通過代碼獲取兩個(gè)UIApplication對(duì)象矿酵,打印地址可以看出地址是相同的)唬复。
(5)利用UIApplication對(duì)象,能進(jìn)行一些應(yīng)用級(jí)別的操作

2.應(yīng)用級(jí)別的操作示例:

(1)設(shè)置應(yīng)用程序圖標(biāo)右上角的紅色提醒數(shù)字(如QQ全肮,微博等消息的時(shí)候敞咧,圖標(biāo)上面會(huì)顯示1,2辜腺,3條新信息等休建。)

@property(nonatomic) NSInteger applicationIconBadgeNumber;
代碼實(shí)現(xiàn)和效果:
- (void)viewDidLoad{
    [super viewDidLoad];
    //創(chuàng)建并添加一個(gè)按鈕
    UIButton *btn=[[UIButton alloc]initWithFrame:CGRectMake(100, 100, 60, 30)];
    [btn setTitle:@"按鈕" forState:UIControlStateNormal];
    [btn setBackgroundColor:[UIColor brownColor]];
    [btn addTarget:self action:@selector(onClick) forControlEvents:UIControlEventTouchUpInside];
    [self.view addSubview:btn];
}
-(void)onClick{
    NSLog(@"按鈕點(diǎn)擊事件");
    //錯(cuò)誤,只能有一個(gè)唯一的UIApplication對(duì)象评疗,不能再進(jìn)行創(chuàng)建
//    UIApplication *app=[[UIApplication alloc]init];
    //通過sharedApplication獲取該程序的UIApplication對(duì)象
    UIApplication *app=[UIApplication sharedApplication];
    app.applicationIconBadgeNumber=123;
}

(2)設(shè)置聯(lián)網(wǎng)指示器的可見性

@property(nonatomic,getter=isNetworkActivityIndicatorVisible) BOOL networkActivityIndicatorVisible;
代碼和效果:
 //設(shè)置指示器的聯(lián)網(wǎng)動(dòng)畫
    app.networkActivityIndicatorVisible=YES;

(3)管理狀態(tài)欄

  • 從iOS7開始测砂,系統(tǒng)提供了2種管理狀態(tài)欄的方式
    通過UIViewController管理(每一個(gè)UIViewController都可以擁有自己不同的狀態(tài)欄).
    在iOS7中,默認(rèn)情況下百匆,狀態(tài)欄都是由UIViewController管理的砌些,UIViewController實(shí)現(xiàn)下列方法就可以輕松管理狀態(tài)欄的可見性和樣式
狀態(tài)欄的樣式    
 - (UIStatusBarStyle)preferredStatusBarStyle; 
狀態(tài)欄的可見性 
-(BOOL)prefersStatusBarHidden;
#pragma mark-設(shè)置狀態(tài)欄的樣式
-(UIStatusBarStyle)preferredStatusBarStyle{
    //設(shè)置為白色
    //return UIStatusBarStyleLightContent;
    //默認(rèn)為黑色
     return UIStatusBarStyleDefault;
}
#pragma mark-設(shè)置狀態(tài)欄是否隱藏(否)
-(BOOL)prefersStatusBarHidden{
    return NO;
}
  • 通過UIApplication管理(一個(gè)應(yīng)用程序的狀態(tài)欄都由它統(tǒng)一管理)
    如果想利用UIApplication來管理狀態(tài)欄,首先得修改Info.plist的設(shè)置


//通過sharedApplication獲取該程序的UIApplication對(duì)象
    UIApplication *app=[UIApplication sharedApplication];
    app.applicationIconBadgeNumber=123;
    
    //設(shè)置指示器的聯(lián)網(wǎng)動(dòng)畫
    app.networkActivityIndicatorVisible=YES;
    //設(shè)置狀態(tài)欄的樣式
    //app.statusBarStyle=UIStatusBarStyleDefault;//默認(rèn)(黑色)
    //設(shè)置為白色+動(dòng)畫效果
      [app setStatusBarStyle:UIStatusBarStyleLightContent animated:YES];
    //設(shè)置狀態(tài)欄是否隱藏
    app.statusBarHidden=YES;
      //設(shè)置狀態(tài)欄是否隱藏+動(dòng)畫效果
    [app setStatusBarHidden:YES withAnimation:UIStatusBarAnimationFade];
  • 補(bǔ)充
    既然兩種都可以對(duì)狀態(tài)欄進(jìn)行管理加匈,那么什么時(shí)候該用什么呢存璃?
    如果狀態(tài)欄的樣式只設(shè)置一次仑荐,那就用UIApplication來進(jìn)行管理;
    如果狀態(tài)欄是否隱藏有巧,樣式不一樣那就用控制器進(jìn)行管理释漆。
    UIApplication來進(jìn)行管理有額外的好處,可以提供動(dòng)畫

(4)openURL:方法
UIApplication有個(gè)功能十分強(qiáng)大的openURL:方法

-(BOOL)openURL:(NSURL*)url;

openURL:方法的部分功能有
打電話

UIApplication *app = [UIApplicationsharedApplication]; [app openURL:[NSURLURLWithString:@"tel://10086"]];
發(fā)短信  [app openURL:[NSURLURLWithString:@"sms://10086"]];
發(fā)郵件  [app openURL:[NSURLURLWithString:@"mailto://12345@qq.com"]];
打開一個(gè)網(wǎng)頁資源 [app openURL:[NSURLURLWithString:@"http://ios.itcast.cn"]];
打開其他app程序   openURL方法篮迎,可以打開其他APP男图。

URL補(bǔ)充:
URL:統(tǒng)一資源定位符,用來唯一的表示一個(gè)資源甜橱。
URL格式:協(xié)議頭://主機(jī)地址/資源路徑
網(wǎng)絡(luò)資源:http/ ftp等 表示百度上一張圖片的地址 http://www.baidu.com/images/20140603/abc.png
本地資源:file:///users/apple/desktop/abc.png(主機(jī)地址省略)

二逊笆、UIApplication Delegate

1.簡單說明
所有的移動(dòng)操作系統(tǒng)都有個(gè)致命的缺點(diǎn):app很容易受到打擾。比如一個(gè)來電或者鎖屏?xí)?dǎo)致app進(jìn)入后臺(tái)甚至被終止岂傲。
還有很多其它類似的情況會(huì)導(dǎo)致app受到干擾难裆,在app受到干擾時(shí),會(huì)產(chǎn)生一些系統(tǒng)事件镊掖,這時(shí)UIApplication會(huì)通知它的delegate對(duì)象乃戈,讓delegate代理來處理這些系統(tǒng)事件。
作用:當(dāng)被打斷的時(shí)候亩进,通知代理進(jìn)入到后臺(tái)症虑。



每次新建完項(xiàng)目,都有個(gè)帶有“AppDelegate”字眼的類归薛,它就是UIApplication的代理,NJAppDelegate默認(rèn)已經(jīng)遵守了UIApplicationDelegate協(xié)議谍憔,已經(jīng)是UIApplication的代理。


屏幕快照 2017-08-04 上午11.48.03.png

2.代理方法
#import "AppDelegate.h"

@interface AppDelegate ()

@end

@implementation AppDelegate

// 當(dāng)應(yīng)用程序啟動(dòng)完畢的時(shí)候就會(huì)調(diào)用(系統(tǒng)自動(dòng)調(diào)用)
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
   
    return YES;
}
//當(dāng)應(yīng)用程序程序失去焦點(diǎn)的時(shí)候調(diào)用(系統(tǒng)自動(dòng)調(diào)用)
- (void)applicationWillResignActive:(UIApplication *)application {
    // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state.
    // Use this method to pause ongoing tasks, disable timers, and invalidate graphics rendering callbacks. Games should use this method to pause the game.
}

//當(dāng)程序進(jìn)入后臺(tái)的時(shí)候調(diào)用
//一般在這里保存應(yīng)用程序的數(shù)據(jù)和狀態(tài)
- (void)applicationDidEnterBackground:(UIApplication *)application {
    // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later.
    // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits.
}

//將要進(jìn)入前臺(tái)的是時(shí)候調(diào)用
//一般在該方法中恢復(fù)應(yīng)用程序的數(shù)據(jù),以及狀態(tài)
- (void)applicationWillEnterForeground:(UIApplication *)application {
    // Called as part of the transition from the background to the active state; here you can undo many of the changes made on entering the background.
}

//應(yīng)用程序獲得焦點(diǎn)
- (void)applicationDidBecomeActive:(UIApplication *)application {
    // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface.
}

// 應(yīng)用程序即將被銷毀的時(shí)候會(huì)調(diào)用該方法
// 注意:如果應(yīng)用程序處于掛起狀態(tài)的時(shí)候無法調(diào)用該方法
- (void)applicationWillTerminate:(UIApplication *)application {
    // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.
}


@end

應(yīng)用程序一般有五個(gè)狀態(tài):官方文檔app.states

三主籍、程序啟動(dòng)原理

UIApplicationMain
main函數(shù)中執(zhí)行了一個(gè)UIApplicationMain這個(gè)函數(shù)

intUIApplicationMain(int argc, char *argv[], NSString *principalClassName, NSString *delegateClassName);

*argc习贫、argv:直接傳遞給UIApplicationMain進(jìn)行相關(guān)處理即可
*principalClassName:指定應(yīng)用程序類名(app的象征),該類必須是UIApplication(或子類)千元。如果為nil,則用UIApplication類作為默認(rèn)值

1苫昌、delegateClassName:指定應(yīng)用程序的代理類,該類必須遵守UIApplicationDelegate協(xié)議
2诅炉、UIApplicationMain函數(shù)會(huì)根據(jù)principalClassName創(chuàng)建UIApplication對(duì)象蜡歹,根據(jù)delegateClassName創(chuàng)建一個(gè)delegate對(duì)象,并將該delegate對(duì)象賦值給UIApplication對(duì)象中的delegate屬性

接著會(huì)建立應(yīng)用程序的Main Runloop(事件循環(huán))涕烧,進(jìn)行事件的處理(首先會(huì)在程序完畢后調(diào)用delegate對(duì)象的application:didFinishLaunchingWithOptions:方法)
程序正常退出時(shí)UIApplicationMain函數(shù)才返回

#import <UIKit/UIKit.h>
#import "AppDelegate.h"

int main(int argc, char * argv[]) {
    @autoreleasepool {
        return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
        /*
         argc: 系統(tǒng)或者用戶傳入的參數(shù)個(gè)數(shù)
         argv: 系統(tǒng)或者用戶傳入的實(shí)際參數(shù)
         1.根據(jù)傳入的第三個(gè)參數(shù)創(chuàng)建UIApplication對(duì)象
         2.根據(jù)傳入的第四個(gè)產(chǎn)生創(chuàng)建UIApplication對(duì)象的代理
         3.設(shè)置剛剛創(chuàng)建出來的代理對(duì)象為UIApplication的代理
         4.開啟一個(gè)事件循環(huán)
         */
    }
}

系統(tǒng)入口的代碼和參數(shù)說明:
argc:系統(tǒng)或者用戶傳入的參數(shù)
argv:系統(tǒng)或用戶傳入的實(shí)際參數(shù)
1.根據(jù)傳入的第三個(gè)參數(shù)月而,創(chuàng)建UIApplication對(duì)象
2.根據(jù)傳入的第四個(gè)產(chǎn)生創(chuàng)建UIApplication對(duì)象的代理
3.設(shè)置剛剛創(chuàng)建出來的代理對(duì)象為UIApplication的代理
4.開啟一個(gè)事件循環(huán)(可以理解為里面是一個(gè)死循環(huán))這個(gè)時(shí)間循環(huán)是一個(gè)隊(duì)列(先進(jìn)先出)先添加進(jìn)去的先處理
ios程序啟動(dòng)原理

四、程序啟動(dòng)的完整過程

1.main函數(shù)
2.UIApplicationMain

  • 創(chuàng)建UIApplication對(duì)象
  • 創(chuàng)建UIApplication的delegate對(duì)象
    3.delegate對(duì)象開始處理(監(jiān)聽)系統(tǒng)事件(沒有storyboard)
  • 程序啟動(dòng)完畢的時(shí)候, 就會(huì)調(diào)用代理的application:didFinishLaunchingWithOptions:方法
  • 在application:didFinishLaunchingWithOptions:中創(chuàng)建UIWindow
  • 創(chuàng)建和設(shè)置UIWindow的rootViewController
  • 顯示窗口

3.根據(jù)Info.plist獲得最主要storyboard的文件名,加載最主要的storyboard(有storyboard)

  • 創(chuàng)建UIWindow
  • 創(chuàng)建和設(shè)置UIWindow的rootViewController
  • 顯示窗口
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末议纯,一起剝皮案震驚了整個(gè)濱河市父款,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖憨攒,帶你破解...
    沈念sama閱讀 216,997評(píng)論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件世杀,死亡現(xiàn)場離奇詭異,居然都是意外死亡肝集,警方通過查閱死者的電腦和手機(jī)瞻坝,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,603評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來杏瞻,“玉大人所刀,你說我怎么就攤上這事±袒樱” “怎么了浮创?”我有些...
    開封第一講書人閱讀 163,359評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長砌函。 經(jīng)常有香客問我斩披,道長,這世上最難降的妖魔是什么讹俊? 我笑而不...
    開封第一講書人閱讀 58,309評(píng)論 1 292
  • 正文 為了忘掉前任垦沉,我火速辦了婚禮,結(jié)果婚禮上仍劈,老公的妹妹穿的比我還像新娘乡话。我一直安慰自己,他們只是感情好耳奕,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,346評(píng)論 6 390
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著诬像,像睡著了一般屋群。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上坏挠,一...
    開封第一講書人閱讀 51,258評(píng)論 1 300
  • 那天芍躏,我揣著相機(jī)與錄音,去河邊找鬼降狠。 笑死对竣,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的榜配。 我是一名探鬼主播否纬,決...
    沈念sama閱讀 40,122評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼蛋褥!你這毒婦竟也來了临燃?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,970評(píng)論 0 275
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎膜廊,沒想到半個(gè)月后乏沸,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,403評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡爪瓜,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,596評(píng)論 3 334
  • 正文 我和宋清朗相戀三年蹬跃,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片铆铆。...
    茶點(diǎn)故事閱讀 39,769評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡蝶缀,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出算灸,到底是詐尸還是另有隱情扼劈,我是刑警寧澤,帶...
    沈念sama閱讀 35,464評(píng)論 5 344
  • 正文 年R本政府宣布菲驴,位于F島的核電站荐吵,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏赊瞬。R本人自食惡果不足惜先煎,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,075評(píng)論 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望巧涧。 院中可真熱鬧薯蝎,春花似錦、人聲如沸谤绳。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,705評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽缩筛。三九已至消略,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間瞎抛,已是汗流浹背艺演。 一陣腳步聲響...
    開封第一講書人閱讀 32,848評(píng)論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留桐臊,地道東北人胎撤。 一個(gè)月前我還...
    沈念sama閱讀 47,831評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像断凶,于是被迫代替她去往敵國和親伤提。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,678評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容