iOS面試題整理(三)

1、NSRunLoop的實現(xiàn)機制,及在多線程中如何使用?

NSRunLoop是IOS消息機制的處理模式

1.NSRunLoop的主要作用:控制NSRunLoop里面線程的執(zhí)行和休眠,在有事情做的時候使當(dāng)前NSRunLoop控制的線程工作,沒有事情做讓當(dāng)前NSRunLoop的控制的線程休眠。

2.NSRunLoop 就是一直在循環(huán)檢測,從線程start到線程end,檢測inputsource(如點擊,雙擊等操作)同步事件,檢測timesource同步事件,檢測到輸入源會執(zhí)行處理函數(shù),首先會產(chǎn)生通知,corefunction向線程添加runloop observers來監(jiān)聽事件,意在監(jiān)聽事件發(fā)生時來做處理。

3.runloopmode是一個集合,包括監(jiān)聽:事件源,定時器,以及需通知的runloop observers

1. 只有在為你的程序創(chuàng)建次線程的時候,才需要運行run loop。對于程序的主線程而言,run loop是關(guān)鍵部分。Cocoa提供了運行主線程run loop的代碼同時也會自動運行run loop。IOS程序UIApplication中的run方法在程序正常啟動的時候就會啟動run loop。如果你使用xcode提供的模板創(chuàng)建的程序,那你永遠(yuǎn)不需要自己去啟動run loop

2. 在多線程中,你需要判斷是否需要run loop。如果需要run loop,那么你要負(fù)責(zé)配置run loop并啟動。你不需要在任何情況下都去啟動run loop。比如,你使用線程去處理一個預(yù)先定義好的耗時極長的任務(wù)時,你就可以毋需啟動run loop。Run loop只在你要和線程有交互時才需要

2、IOS7之前,后臺執(zhí)行內(nèi)容有幾種形式,都是什么?

一般的應(yīng)用在進(jìn)入后臺的時候可以獲取一定時間來運行相關(guān)任務(wù),也就是說可以在后臺運行一小段時間(10S左右)。

1. 后臺播放音樂

2. 后臺GPS跟蹤

3. 后臺voip支持

3、簡單說一下APP的啟動過程,從main文件開始說起。

程序啟動分為兩類:1.有storyboard 2.沒有storyboard

有storyboard情況下:

1.main函數(shù)

2.UIApplicationMain

* 創(chuàng)建UIApplication對象

* 創(chuàng)建UIApplication的delegate對象

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

* 創(chuàng)建UIWindow

* 創(chuàng)建和設(shè)置UIWindow的rootViewController

* 顯示窗口

沒有storyboard情況下:

1.main函數(shù)

2.UIApplicationMain

* 創(chuàng)建UIApplication對象

* 創(chuàng)建UIApplication的delegate對象

3.delegate對象開始處理(監(jiān)聽)系統(tǒng)事件(沒有storyboard)

* 程序啟動完畢的時候, 就會調(diào)用代理的application:didFinishLaunchingWithOptions:方法

* 在application:didFinishLaunchingWithOptions:中創(chuàng)建UIWindow

* 創(chuàng)建和設(shè)置UIWindow的rootViewController

* 顯示窗口

4、把程序自己關(guān)掉和程序進(jìn)入后臺,遠(yuǎn)程推送的區(qū)別?

1. 關(guān)掉后不執(zhí)行任何代碼,不能處理事件

2. 應(yīng)用程序進(jìn)入后臺狀態(tài)不久后轉(zhuǎn)入掛起狀態(tài)。在這種狀態(tài)下,應(yīng)用程序不執(zhí)行任何代碼,并有可能在任意時候從內(nèi)存中刪除。只有當(dāng)用戶再次運行此應(yīng)用,應(yīng)用才會從掛起狀態(tài)喚醒,代碼得以繼續(xù)執(zhí)行.或者進(jìn)入后臺時開啟多任務(wù)狀態(tài),保留在內(nèi)存中,這樣就可以執(zhí)行系統(tǒng)允許的動作

3. 遠(yuǎn)程推送是由遠(yuǎn)程服務(wù)器上的程序發(fā)送到APNS,再由APNS把消息推送至設(shè)備上的程序,當(dāng)應(yīng)用程序收到推送的消息會自動調(diào)用特定的方法執(zhí)行事先寫好的代碼

5、本地通知和遠(yuǎn)程推送通知對基本概念和用法?

本地通知和遠(yuǎn)程推送通知都可以向不在前臺運行的應(yīng)用發(fā)送消息,這種消息既可能是即將發(fā)生的事件,也可能是服務(wù)器的新數(shù)據(jù).不管是本地通知還是遠(yuǎn)程通知,他們在程序界面的顯示效果相同,都可能顯示為一段警告信息或應(yīng)用程序圖標(biāo)上的微章.

本地通知和遠(yuǎn)程推送通知的基本目的都是讓應(yīng)用程序能夠通知用戶某些事情, 而且不需要應(yīng)用程序在前臺運行.二者的區(qū)別在于本地通知由本應(yīng)用負(fù)責(zé)調(diào)用,只能從當(dāng)前設(shè)備上的iOS發(fā)出, 而遠(yuǎn)程通知由遠(yuǎn)程服務(wù)器上的程序發(fā)送到APNS,再由APNS把消息推送至設(shè)備上的程序

6、 UITableViewController中,創(chuàng)建UITableViewCell時,initWithSytle:resuseIdentifier中,reuseIdentifier有什么用?簡述UITableViewCell的復(fù)用原理.

復(fù)用隊列的元素增加:只有在cell被滑動出界面的時候,此cell才會被加入到復(fù)用隊列中。每次在創(chuàng)建cell的時候,程序會首先通過調(diào)用dequeueReusableCellWithIdentifier:cellType方法,到復(fù)用隊列中去尋找標(biāo)示符為“cellType”的cell,如果找不到,返回nil,然后程序去通過調(diào)用[[[UITableViewCell alloc] initWithStyle:style reuseIdentifier:cellType] autorelease]來創(chuàng)建標(biāo)示符為“cellType”的cell。

7、?ViewControllerloadView, viewDidLoad, viewDidUnload分別是在什么時候調(diào)用的?在自定義ViewController的時候這幾個函數(shù)里面應(yīng)該做什么工作?

答:viewDidLoad在view 從nib文件初始化時調(diào)用,loadView在controller的view為nil時調(diào)用。此方法在編程實現(xiàn)view時調(diào)用,view 控制器默認(rèn)會注冊memory warning notification,當(dāng)view controller的任何view 沒有用的時候,viewDidUnload會被調(diào)用,在這里實現(xiàn)將retain 的view release,如果是retain的IBOutlet view 屬性則不要在這里release,IBOutlet會負(fù)責(zé)release 。

8、Objective C中的selector是什么?

你可以理解 @selector()就是取類方法的編號,他的行為基本可以等同C語言的中函數(shù)指針,只不過C語言中,可以把函數(shù)名直接賦給一個函數(shù)指針,而Objective-C的類不能直接應(yīng)用函數(shù)指針,這樣只能做一個@selector語法來取.它的結(jié)果是一個SEL類型。這個類型本質(zhì)是類方法的編號(函數(shù)地址)。

9、定義屬性時,什么情況使用copy,assign,和retain?

assign用于簡單數(shù)據(jù)類型,如NSInteger,double,bool,retain 和copy用戶對象,copy用于當(dāng) a指向一個對象,b也想指向同樣的對象的時候,如果用assign,a如果釋放,再調(diào)用b會crash,如果用copy 的方式,a和b各自有自己的內(nèi)存,就可以解決這個問題。retain 會使計數(shù)器加一,也可以解決assign的問題。另外:atomic和nonatomic用來決定編譯器生成的getter和setter是否為原子操作。在多線程環(huán)境下,原子操作是必要的,否則有可能引起錯誤的結(jié)果。加了atomic,setter函數(shù)會變成下面這樣:

if (property != newValue) {?????? [property release];?????? property = [newValue retain];?? }

10、單件實例是什么?

Foundation 和 Application Kit 框架中的一些類只允許創(chuàng)建單件對象,即這些類在當(dāng)前進(jìn)程中的唯一實例。舉例來說,NSFileManager 和NSWorkspace 類在使用時都是基于進(jìn)程進(jìn)行單件對象的實例化。當(dāng)向這些類請求實例的時候,它們會向您傳遞單一實例的一個引用,如果該實例還不存在,則首先進(jìn)行實例的分配 和初始化。 單件對象充當(dāng)控制中心的角色,負(fù)責(zé)指引或協(xié)調(diào)類的各種服務(wù)。如果類在概念上只有一個實例(比如NSWorkspace),就應(yīng)該產(chǎn)生 一個單件實例,而不是多個實例;如果將來某一天可能有多個實例,您可以使用單件實例機制,而不是工廠方法或函數(shù)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容