iOS UIApplication詳解(待更新)

UIApplication對(duì)象是應(yīng)用程序的象征

  • 每一個(gè)應(yīng)用都有自己的UIApplication對(duì)象,而且是單例的
  • 通過[UIApplication sharedApplication]可以獲得這個(gè)單例對(duì)象,命名規(guī)范一般單例都是使用shared拿到
  • 一個(gè)iOS程序創(chuàng)建的第一個(gè)對(duì)象就是UIApplication對(duì)象
  • 利用UIApplication對(duì)象,能進(jìn)行一些應(yīng)用級(jí)別操作

什么是單例?

整個(gè)應(yīng)用程序中只有一份,即只有一份內(nèi)存,并不會(huì)分配多余的內(nèi)存
新建項(xiàng)目,在ViewDidLoad中創(chuàng)建,會(huì)崩潰,原因?yàn)榧t色所圈部分


單例演示

蘋果單例實(shí)現(xiàn):

1.內(nèi)部創(chuàng)建單例對(duì)象,程序啟動(dòng)的時(shí)創(chuàng)建該單例
2.提供一個(gè)方法,方便給外界獲取單例對(duì)象
3.外界不能調(diào)用alloc方法,一調(diào)用就會(huì)崩潰,即拋異常

模仿UIApplication單例對(duì)象的實(shí)現(xiàn),來更好的認(rèn)識(shí)UIApplication

1.創(chuàng)建一個(gè)CrabMan,通過重寫類方法load來模仿(類名隨意)項(xiàng)目一啟動(dòng)就創(chuàng)建對(duì)象。load方法會(huì)在程序一啟動(dòng)時(shí)自動(dòng)調(diào)用,將程序中所有的類加載出來,下圖為驗(yàn)證效果圖

+load方法講解

2.創(chuàng)建并保存對(duì)象
創(chuàng)建完成后,使用靜態(tài)全局變量來保存,并聲明share方法供外部調(diào)用
疑問:為什么不用屬性來保存?
解答:因?yàn)閷傩允菍儆趯?duì)象的,在load方法對(duì)象還未創(chuàng)建完成,不能用對(duì)象的屬性來保存該對(duì)象本身。

疑問:為什么只在.m文件中實(shí)現(xiàn)load方法?
解答:我們demo的目的是演示UIApplication的單例,對(duì)象的創(chuàng)建在內(nèi)部進(jìn)行,獲取單例對(duì)象的方法提供給外部使用,該解答也回答了為什么shareCranMan方法需要在.h文件中聲明。

對(duì)象的創(chuàng)建以及保存

3.重寫系統(tǒng)alloc方法并拋異常
疑問:為什么return返回的是[super alloc]
解答:調(diào)用系統(tǒng)默認(rèn)的方法,因?yàn)槲覀儾恢婪峙鋬?nèi)存的實(shí)現(xiàn),又不想要覆蓋原來方法的實(shí)現(xiàn),所以就需要調(diào)用super alloc方法并將其返回

重新alloc方法

4.演示結(jié)果,外界調(diào)用alloc崩潰


結(jié)果演示

UIApplication的常用屬性

  • 設(shè)置應(yīng)用程序圖標(biāo)右上角的紅色提醒數(shù)字
    @property(nonatomic) NSInteger applicationIconBadgeNumber;
badge
  • 設(shè)置聯(lián)網(wǎng)指示器的可見性
    @property(nonatomic,getter=isNetworkActivityIndicatorVisible) BOOL NetworkActivityIndicatorVisible;
    聯(lián)網(wǎng)指示器
  • iOS 7 的狀態(tài)欄
  • 打電話,發(fā)短信(需要真機(jī))打開網(wǎng)頁
- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    UIApplication *application = [UIApplication sharedApplication];
    //1.獲取應(yīng)用程序圖標(biāo)的提醒數(shù)字
    /**
     設(shè)置后無效,查看屬性下的英文注釋:
     set to 0 to hide. default is 0. In iOS 8.0 and later, your application must register for user notifications using -[UIApplication registerUserNotificationSettings:] before
     */
    application.applicationIconBadgeNumber = 10;
    //創(chuàng)建通知對(duì)象
       UIUserNotificationSettings *setting = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeBadge categories:nil];
    //注冊(cè)用戶通知
    [application registerUserNotificationSettings:setting];
    
    //2.設(shè)置聯(lián)網(wǎng)提示
    application.networkActivityIndicatorVisible = YES;
    
    
    //3.設(shè)置狀態(tài)欄
    
    //application.statusBarHidden = YES;
    /**
     設(shè)置無效,查看官方注釋
      Setting statusBarHidden does nothing if your application is using the default UIViewController-based status bar system.
     iOS7之后默認(rèn)交給控制器管理狀態(tài)欄
     */
   // - (BOOL)prefersStatusBarHidden NS_AVAILABLE_IOS(7_0) __TVOS_PROHIBITED; // Defaults to NO
    // Override to return the type of animation that should be used for status bar changes for this view controller. This currently only affects changes to prefersStatusBarHidden.
    //配置info:添加key:View controller-based status bar appearance,并設(shè)置為NO,將狀態(tài)欄的設(shè)置交給application來管理
    
    //方法已經(jīng)過期
    [application setStatusBarHidden:YES withAnimation:UIStatusBarAnimationSlide];
    
    
    //4.打電話 發(fā)信息 打開網(wǎng)頁
    
    //打開網(wǎng)頁:URL:資源的唯一標(biāo)示;協(xié)議頭+資源路徑
    //原理:根據(jù)協(xié)議頭判斷用什么軟件打開
    [application openURL:[NSURL URLWithString:@"http://www.baidu.com"]];    
}

UIApplication和delegate

  • 所有的移動(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)事件

delegate可處理的事件包括:

  • 應(yīng)用程序的生命周期事件(如程序的啟動(dòng)和關(guān)閉)
  • 系統(tǒng)事件(如來電)
  • 內(nèi)存警告
UIApplication和delegate

delegate方法講解:

//應(yīng)用程序啟動(dòng)完成后就會(huì)調(diào)用AppDelegate方法
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    // Override point for customization after application launch.
    return YES;
}
//當(dāng)應(yīng)用程序失去焦點(diǎn)的時(shí)候調(diào)用,只有當(dāng)應(yīng)用程序完全獲取焦點(diǎn)的時(shí)候才能夠與用戶交互,所謂的獲取焦點(diǎn)我的理解為app啟動(dòng)布滿屏幕。
- (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 throttle down OpenGL ES frame rates. Games should use this method to pause the game.
}
//當(dāng)應(yīng)用程序進(jìn)入后臺(tái)時(shí)候調(diào)用
- (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.
}
//當(dāng)應(yīng)用程序即將進(jìn)入前臺(tái)的時(shí)候調(diào)用
- (void)applicationWillEnterForeground:(UIApplication *)application {
    // Called as part of the transition from the background to the inactive state; here you can undo many of the changes made on entering the background.
}
//當(dāng)應(yīng)用程序獲得焦點(diǎn)的時(shí)候調(diào)用
- (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.
}
//當(dāng)應(yīng)用程序關(guān)閉的時(shí)候調(diào)用
- (void)applicationWillTerminate:(UIApplication *)application {
    // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.
}

@end

各方法的調(diào)用時(shí)機(jī)的演示以及講解
1.程序一啟動(dòng)未做任何操作
程序加載完畢,并獲得焦點(diǎn)


程序啟動(dòng)

2.點(diǎn)擊home鍵進(jìn)入手機(jī)主界面
application先失去焦點(diǎn)然后 進(jìn)入后臺(tái)


程序進(jìn)入后臺(tái)

3.點(diǎn)擊應(yīng)用重新進(jìn)入
application進(jìn)入前臺(tái)然后獲得焦點(diǎn)


程序進(jìn)入前臺(tái)

4.雙擊home鍵關(guān)閉程序
程序關(guān)閉
關(guān)閉程序

由控制臺(tái)打印結(jié)果可知按照上面的操作,先后順序?yàn)椋?br> 程序加載完畢-->程序獲得焦點(diǎn)-->程序失去焦點(diǎn)-->程序進(jìn)入后臺(tái)-->程序進(jìn)入前臺(tái)-->程序獲得焦點(diǎn)-->程序關(guān)閉

程序的啟動(dòng)流程

講解

演示main以及控制臺(tái)打印結(jié)果

查看官方文檔,了解參數(shù)的介紹
第三個(gè)參數(shù):UIApplication類名或者子類的名稱,如果傳nil的話默認(rèn)為@“UIApplication”
第四個(gè)參數(shù):UIApplication的代理的類型名稱,蘋果使用NSStringFromClass([AppDelegate class])方法,獲得對(duì)應(yīng)類名,使用該方法除了可以避免輸入錯(cuò)誤的同時(shí)還具有提示功能。


官方文檔

UIApplication底層實(shí)現(xiàn)原理:

1.根據(jù)principalClassName(第三個(gè)參數(shù))傳遞的類名創(chuàng)建一個(gè)UIApplication對(duì)象
2.創(chuàng)建UIApplication代理對(duì)象,給UIApplication對(duì)象設(shè)置代理
3.開啟主運(yùn)行事件循環(huán),處理事件,保持程序一直運(yùn)行(后期runloop講解)
4.加載Info.plist,判斷application的Info.pist文件是否指定main,如果指定main就會(huì)記載nib文件

iOS程序的啟動(dòng)過程流程圖

流程圖
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,698評(píng)論 6 539
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,202評(píng)論 3 426
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,742評(píng)論 0 382
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,580評(píng)論 1 316
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 72,297評(píng)論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,688評(píng)論 1 327
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,693評(píng)論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,875評(píng)論 0 289
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,438評(píng)論 1 335
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 41,183評(píng)論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 43,384評(píng)論 1 372
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,931評(píng)論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,612評(píng)論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,022評(píng)論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,297評(píng)論 1 292
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 52,093評(píng)論 3 397
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 48,330評(píng)論 2 377

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

  • *面試心聲:其實(shí)這些題本人都沒怎么背,但是在上海 兩周半 面了大約10家 收到差不多3個(gè)offer,總結(jié)起來就是把...
    Dove_iOS閱讀 27,197評(píng)論 30 471
  • 1.屬性readwrite,readonly,assign,retain,copy,nonatomic 各是什么作...
    曾令偉閱讀 1,077評(píng)論 0 10
  • *7月8日上午 N:Block :跟一個(gè)函數(shù)塊差不多,會(huì)對(duì)里面所有的內(nèi)容的引用計(jì)數(shù)+1,想要解決就用__block...
    炙冰閱讀 2,512評(píng)論 1 14
  • 1,NSObject中description屬性的意義,它可以重寫嗎?答案:每當(dāng) NSLog(@"")函數(shù)中出現(xiàn) ...
    eightzg閱讀 4,175評(píng)論 2 19
  • 一直都知道有一種家叫娘家,但未曾感受過。如今,我也有了娘家,有了婆家,但心里并沒感覺到更加的安穩(wěn)和平靜,更多的是不...
    一瞬間的回轉(zhuǎn)閱讀 199評(píng)論 0 0