1. NSRunLoop的實現(xiàn)機(jī)制,及在多線程中如何使用?
NSRunLoop是iOS消息機(jī)制的處理模式
- NSRunLoop的主要作用:控制NSRunLoop里面線程的執(zhí)行和休眠,在有事情做的時候使當(dāng)前NSRunLoop控制的線程工作,沒有事情做讓當(dāng)前NSRunLoop控制的線程休眠;
- NSRunLoop就是一直在循環(huán)檢測,從線程start到線程end,檢測inputsource(如點(diǎn)擊,雙擊等操作)異步事件;檢測timesource同步事件;檢測到輸入源會執(zhí)行處理函數(shù),首先會產(chǎn)生通知,corefunction向線程添加runloop observers來檢測事件,意在監(jiān)聽事件發(fā)生時來做處理;
- runloopmode是一個集合,包括監(jiān)聽:事件源、定時器、以及需要通知的runloop observers;
- 只有在為你的程序創(chuàng)建次線程的時候,才需要運(yùn)行runloop。對于程序的主線程而言,runloop是關(guān)鍵部分。Cocoa提供了運(yùn)行主線程runloop的代碼同時也會自動運(yùn)行runloop。iOS程序UIApplication中的run方法在程序正常啟動的時候就會啟動runloop。如果你使用Xcode提供的模板創(chuàng)建的程序,那你永遠(yuǎn)不需要自己去啟動runloop;
- 在多線程中,你需要判斷是否需要runloop。如果需要runloop,那么你要負(fù)責(zé)配置runloop并啟動。你不需要在任何情況下都啟動runloop,比如你使用線程去處理一個預(yù)先定義好的耗時極長的任務(wù)時,你就可以無需啟動runloop。runloop只在你要和線程有交互時才需要。
2. iOS7之前,后臺執(zhí)行內(nèi)容有幾種形式,都是什么?
一般的應(yīng)用在進(jìn)入后臺的時候可以獲取一定的時間來運(yùn)行相關(guān)任務(wù),也就是說可以在后臺運(yùn)行一段時間(10s 左右)。
- 后臺播放音樂
- 后臺GPS跟蹤
- 后臺VoIP支持
3. 簡單說一下APP的啟動過程,從main文件開始說起。
程序啟動分為兩類:
有storyboard
無storyboard
-
有storyboard的情況下:
- main函數(shù)
- UIApplicationMain
- 創(chuàng)建UIApplication對象
- 創(chuàng)建UIApplication的delegate對象
- 根據(jù)Info.plist獲得最主要storyboard的文件名,加載最主要的storyboard(有storyboard)
- 創(chuàng)建UIWindow
- 創(chuàng)建和設(shè)置UIWindow的rootViewController
- 顯示窗口
-
無storyboard情況下:
- main函數(shù)
- UIApplicationMain
- 創(chuàng)建UIApplication對象
- 創(chuàng)建UIApplication的delegate對象
- delegate對象開始處理(監(jiān)聽)系統(tǒng)事件(沒有storyboard)
- 程序啟動完畢的時候,就會調(diào)用代理的
application:didFinishLaunchingWithOptions:方法 - 在
application:didFinishLaunchingWithOptions:中創(chuàng)建UIWindow - 創(chuàng)建和設(shè)置UIWindow的rootViewController
- 顯示窗口
- 程序啟動完畢的時候,就會調(diào)用代理的
4. 程序自己關(guān)掉和程序進(jìn)入后臺、遠(yuǎn)程推送的區(qū)別
- 關(guān)掉后不執(zhí)行任何代碼,不能處理事件;
- 應(yīng)用程序進(jìn)入后臺狀態(tài)不久后轉(zhuǎn)入掛起狀態(tài)。在這種狀態(tài)下,應(yīng)用程序不執(zhí)行任何代碼,并有可能在任意時候從內(nèi)存中刪除。只有當(dāng)用戶再次運(yùn)行此應(yīng)用,應(yīng)用才會從掛起狀態(tài)喚醒,代碼得以繼續(xù)執(zhí)行;
- 或者進(jìn)入后臺時開啟多任務(wù)狀態(tài),保留在內(nèi)存中,這樣就可以執(zhí)行系統(tǒng)允許的動作;
- 遠(yuǎn)程推送是由遠(yuǎn)程服務(wù)器上的程序發(fā)送到APNS,再由APNS把消息推送至設(shè)備上的程序,當(dāng)應(yīng)用程序收到推送的消息會自動調(diào)用特定的方法執(zhí)行事先寫好的代碼。
5. 本地通知和遠(yuǎn)程推送通知的基本概念和用法?
- 本地通知和遠(yuǎn)程推送通知都可以向不在前臺運(yùn)行的應(yīng)用發(fā)送消息,這種消息既可能是即將發(fā)生的事件,也可能是服務(wù)器的新數(shù)據(jù)。不管是本地通知還是遠(yuǎn)程通知,他們在程序界面的顯示效果相同,都可能顯示為一段警告信息或應(yīng)用程序圖標(biāo)上的徽章。
- 本地通知和遠(yuǎn)程推送通知的基本目的都是讓應(yīng)用程序能夠通知用戶某些事情,而且不需要應(yīng)用程序在前臺運(yùn)行。二者的區(qū)別在于本地通知由本應(yīng)用負(fù)責(zé)調(diào)用,只能從當(dāng)前設(shè)備上的iOS發(fā)出,而遠(yuǎn)程通知由遠(yuǎn)程服務(wù)器上的程序發(fā)送到APNS,再由APNS把消息推送至設(shè)備上的程序。
-
圖示如下:
本地通知.png
遠(yuǎn)程通知.png

