作為iOS小白,總免不了各種面試,特將自己近期的幾道面試題小結一下。同時也將無意閑逛時發現一位超級全面的面試總結分享給大家,共同進步。
1. NSRunLoop的實現機制,及在多線程中如何使用?
*
NSRunLoop是IOS消息機制的處理模式。
*
NSRunLoop的主要作用:控制NSRunLoop里面線程的執行和休眠,在有事情做的時候使當前NSRunLoop控制的線程工作,沒有事情做讓當前NSRunLoop的控制的線程休眠。
*
NSRunLoop 就是一直在循環檢測,從線程start到線程end,檢測inputsource(如點擊,雙擊等操作)同步事件,檢測timesource同步事件,檢測到輸入源會執行處理函數,首先會產生通知,corefunction向線程添加runloop observers來監聽事件,意在監聽事件發生時來做處理。
*
runloopmode是一個集合,包括監聽:事件源,定時器,以及需通知的runloop observers。
*--**--**--**--**--**--*
*
只有在為你的程序創建次線程的時候,才需要運行run loop。對于程序的主線程而言,run loop是關鍵部分。Cocoa提供了運行主線程run loop的代碼同時也會自動運行run loop。IOS程序UIApplication中的run方法在程序正常啟動的時候就會啟動run loop。如果你使用xcode提供的模板創建的程序,那你永遠不需要自己去啟動run loop。
*
在多線程中,你需要判斷是否需要run loop。如果需要run loop,那么你要負責配置run loop并啟動。你不需要在任何情況下都去啟動run loop。比如,你使用線程去處理一個預先定義好的耗時極長的任務時,你就可以毋需啟動run loop。Run loop只在你要和線程有交互時才需要。
2.IOS7之前,后臺執行內容有幾種形式,都是什么
*
一般的應用在進入后臺的時候可以獲取一定時間來運行相關任務,也就是說可以在后臺運行一小段時間(10s左右)。
1.
后臺播放音樂
2.
后臺GPS跟蹤
3.
后臺voip支持
3. 簡單說一下APP的啟動過程,從main文件開始說起
程序啟動分為兩類:1.有storyboard 2.沒有storyboard
*
有storyboard情況下:
1.
main函數
2.
UIApplicationMain
創建UIApplication對象--創建UIApplication的delegate對象。
3.
根據Info.plist獲得最主要storyboard的文件名,加載最主要的storyboard(有storyboard)。
創建UIWindow--創建和設置UIWindowrootViewController
--顯示窗口。
*
沒有storyboard情況下:
1.
main函數
2.
UIApplicationMain
*
創建UIApplication對象
*
創建UIApplication的delegate對象
*
delegate對象開始處理(監聽)系統事件(沒有storyboard)
*
程序啟動完畢的時候, 就會調用代理 Eapplication:didFinishLaunchingWithOptions:方法
*
在application:didFinishLaunchingWithOptions:中創建UIWindow
*
創建和設置UIWindow的rootViewController
*
顯示窗口
4.把程序自己關掉和程序進入后臺,遠程推送的區別
*
關掉后不執行任何代碼,不能處理事件。
*
應用程序進入后臺狀態不久后轉入掛起狀態。在這種狀態下,應用程序不執行任何代碼,并有可能在任意時候從內存中刪除。只有當用戶再次運行此應用,應用才會從掛起狀態喚醒,代碼得以繼續執行.或者進入后臺時開啟多任務狀態,保留在內存中,這樣就可以執行系統允許的動作。
*
遠程推送是由遠程服務器上的程序發送到APNS,再由APNS把消息推送至設備上的程序,當應用程序收到推送的消息會自動調用特定的方法執行事先寫好的代碼。
5.本地通知和遠程推送通知對基本概念和用法
本地通知和遠程推送通知都可以向不在前臺運行的應用發送消息,這種消息既可能是即將發生的事件,也可能是服務器的新數據.不管是本地通知還是遠程通知,他們在程序界面的顯示效果相同,都可能顯示為一段警告信息或應用程序圖標上的微章。
本地通知和遠程推送通知的基本目的都是讓應用程序能夠通知用戶某些事情, 而且不需要應用程序在前臺運行.二者的區別在于本地通知由本應用負責調用,只能從當前設備上的iOS發出, 而遠程通知由遠程服務器上的程序發送到APNS,再由APNS把消息推送至設備上的程序。
6. MVC設計模式是什么? 你還熟悉什么設計模式?
*
設計模式:并不是一種新技術,而是一種編碼經驗,使用比如java中的接口,iphone中的協議,繼承關系等基本手段,用比較成熟的邏輯去處理某一種類型的事情,總結為所謂設計模式。面向對象編程中,java已經歸納了23種設計模式。
*
mvc設計模式 :模型,視圖,控制器,可以將整個應用程序在思想上分成三大塊,對應是的數據的存儲或處理,前臺的顯示,業務邏輯的控制。 Iphone本身的設計思想就是遵循mvc設計模式。其不屬于23種設計模式范疇。
*
代理模式:代理模式給某一個對象提供一個代理對象,并由代理對象控制對源對象的引用.比如一個工廠生產了產品,并不想直接賣給用戶,而是搞了很多代理商,用戶可以直接找代理商買東西,代理商從工廠進貨.常見的如QQ的自動回復就屬于代理攔截,代理模式在iphone中得到廣泛應用。
*
單例模式:說白了就是一個類不通過alloc方式創建對象,而是用一個靜態方法返回這個類的對象。系統只需要擁有一個的全局對象,這樣有利于我們協調系統整體的行為,比如想獲得[UIApplication sharedApplication];任何地方調用都可以得到 UIApplication的對象,這個對象是全局唯一的。
*
觀察者模式: 當一個物體發生變化時,會通知所有觀察這個物體的觀察者讓其做出反應。實現起來無非就是把所有觀察者的對象給這個物體,當這個物體的發生改變,就會調用遍歷所有觀察者的對象調用觀察者的方法從而達到通知觀察者的目的。
*
最后給大家分享一個超級大牛的面試題庫--->踩飛機票。
(https://github.com/ChenYilong/iOSInterviewQuestions)
<p>超全iOS面試題集錦<a ></p>