iOS面試進(jìn)階篇(七)-經(jīng)典面試題

目錄
1.你使用過(guò)Objective-C的運(yùn)行時(shí)編程(Runtime Programming)么壮啊?如果使用過(guò),你用它做了什么?你還能記得你所使用的相關(guān)的頭文件或者某些方法的名稱嗎?

Objecitve-C的重要特性是Runtime(運(yùn)行時(shí)),在#import <objc/runtime.h>下能看到相關(guān)的方法炊琉,用過(guò)objc_getClass()和class_copyMethodList()獲取過(guò)私有API;

使用

Method method1 = class_getInstanceMethod(cls, sel1);
Method method2 = class_getInstanceMethod(cls, sel2);
method_exchangeImplementations(method1, method2);
2.你實(shí)現(xiàn)過(guò)多線程的Core Data么?NSPersistentStoreCoordinator又活,NSManagedObjectContext和NSManagedObject中的哪些需要在線程中創(chuàng)建或者傳遞苔咪?你是用什么樣的策略來(lái)實(shí)現(xiàn)的?

待整理柳骄!

3.Core開(kāi)頭的系列的內(nèi)容团赏。是否使用過(guò)CoreAnimation和CoreGraphics。UI框架和CA耐薯,CG框架的聯(lián)系是什么舔清?分別用CA和CG做過(guò)些什么動(dòng)畫或者圖像上的內(nèi)容。(有需要的話還可以涉及Quartz的一些內(nèi)容)

待整理

4.是否使用過(guò)CoreText或者CoreImage等曲初?如果使用過(guò)体谒,請(qǐng)談?wù)勀闶褂肅oreText或者CoreImage的體驗(yàn)。
  • CoreText可以解決復(fù)雜文字內(nèi)容排版問(wèn)題臼婆。
  • CoreImage可以處理圖片抒痒,為其添加各種效果。體驗(yàn)是很強(qiáng)大颁褂,挺復(fù)雜的故响。
5.NSNotification和KVO的區(qū)別和用法是什么?什么時(shí)候應(yīng)該使用通知痢虹,什么時(shí)候應(yīng)該使用KVO被去,它們的實(shí)現(xiàn)上有什么區(qū)別嗎?如果用protocol和delegate(或者delegate的Array)來(lái)實(shí)現(xiàn)類似的功能可能嗎奖唯?如果可能,會(huì)有什么潛在的問(wèn)題糜值?如果不能丰捷,為什么?(雖然protocol和delegate這種東西面試已經(jīng)面爛了…)
  • NSNotification是通知模式在iOS的實(shí)現(xiàn)
  • KVO的全稱是鍵值觀察(Key-value observing),其是基于KVC(key-value coding)的
  • KVC是一個(gè)通過(guò)屬性名訪問(wèn)屬性變量的機(jī)制寂汇。
  • 例如將Module層的變化病往,通知到多個(gè)Controller對(duì)象時(shí),可以使用NSNotification骄瓣;如果是只需要觀察某個(gè)對(duì)象的某個(gè)屬性停巷,可以使用KVO。
6.你用過(guò)NSOperationQueue么?如果用過(guò)或者了解的話畔勤,你為什么要使用NSOperationQueue蕾各,實(shí)現(xiàn)了什么?請(qǐng)描述它和GCD的區(qū)別和類似的地方(提示:可以從兩者的實(shí)現(xiàn)機(jī)制和適用范圍來(lái)描述)庆揪。

NSOperationQueue

  • 使用NSOperationQueue用來(lái)管理子類化的NSOperation對(duì)象式曲,控制其線程并發(fā)數(shù)目。
  • GCD和NSOperation都可以實(shí)現(xiàn)對(duì)線程的管理缸榛,區(qū)別是NSOperation和NSOperationQueue是多線程的面向?qū)ο蟪橄罅咝摺m?xiàng)目中使用NSOperation的優(yōu)點(diǎn)是NSOperation是對(duì)線程的高度抽象,在項(xiàng)目中使用它内颗,會(huì)使項(xiàng)目的程序結(jié)構(gòu)更好钧排,子類化NSOperation的設(shè)計(jì)思路,是具有面向?qū)ο蟮膬?yōu)點(diǎn)(復(fù)用均澳、封裝)恨溜,使得實(shí)現(xiàn)是多線程支持,而接口簡(jiǎn)單负懦,建議在復(fù)雜項(xiàng)目中使用筒捺。

GCD
項(xiàng)目中使用GCD的優(yōu)點(diǎn)是GCD本身非常簡(jiǎn)單、易用纸厉,對(duì)于不復(fù)雜的多線程操作系吭,會(huì)節(jié)省代碼量,而B(niǎo)lock參數(shù)的使用颗品,會(huì)是代碼更為易讀肯尺,建議在簡(jiǎn)單項(xiàng)目中使用。

5.既然提到GCD躯枢,那么問(wèn)一下在使用GCD以及block時(shí)要注意些什么则吟?它們兩是一回事兒么?block在ARC中和傳統(tǒng)的MRC中的行為和用法有沒(méi)有什么區(qū)別锄蹂,需要注意些什么氓仲?如何避免循環(huán)引用?
  • 使用block是要注意得糜,若將block做函數(shù)參數(shù)時(shí)敬扛,需要把它放到最后
  • GCD是Grand Central Dispatch,是一個(gè)對(duì)線程開(kāi)源類庫(kù)朝抖,而B(niǎo)lock是閉包啥箭,是能夠讀取其他函數(shù)內(nèi)部變量的函數(shù)
7.您是否做過(guò)異步的網(wǎng)絡(luò)處理和通訊方面的工作?如果有治宣,能具體介紹一些實(shí)現(xiàn)策略么急侥?

待整理

8.對(duì)于Objective-C砌滞,你認(rèn)為它最大的優(yōu)點(diǎn)和最大的不足是什么?對(duì)于不足之處坏怪,現(xiàn)在有沒(méi)有可用的方法繞過(guò)這些不足來(lái)實(shí)現(xiàn)需求贝润。如果可以的話,你有沒(méi)有考慮或者實(shí)踐過(guò)重新實(shí)現(xiàn)OC的一些功能陕悬,如果有题暖,具體會(huì)如何做?
  • 最大的優(yōu)點(diǎn)是它的運(yùn)行時(shí)特性
  • 不足是沒(méi)有命名空間捉超,對(duì)于命名沖突胧卤,可以使用長(zhǎng)命名法或特殊前綴解決,如果是引入的第三方庫(kù)之間的命名沖突拼岳,可以使用link命令及flag解決沖突枝誊。
9.如何獲取通訊錄數(shù)據(jù)

從通訊錄數(shù)據(jù)庫(kù)查詢聯(lián)系人數(shù)據(jù)是無(wú)法使用SQL語(yǔ)句,只能通過(guò)ABAddressBookCopyArrayOfAllPeople惜纸、ABAddressBookCopyPeopleWithName來(lái)獲得叶撒。ABAddressBookCopyArrayOfAllPeople函數(shù)是通過(guò)人名查詢通訊錄中的聯(lián)系人,其中的name參數(shù)是查詢的前綴關(guān)鍵字耐版。

10.NSURLConnection類的同步請(qǐng)求方法?
A.+sendSynchronousRequest:returningResponse:error:
B.-initWithRequest:delegate:
C.-initWithRequest:delegate:startImmediately:

理解:B和C都是異步方法祠够,需要設(shè)置delegate屬性。

10.genstrings命名的語(yǔ)法
genstrings [-a] [-q] [-o <outputDir>] sourcefile

其中參數(shù):

-a:在存在的文件后面追加內(nèi)容粪牲;
-q:關(guān)閉多個(gè)鍵值對(duì)的警告古瓤;
-o:指定輸出目錄

因此如果我們想輸出到en.lproj目錄,則代碼如下:

genstrings -o en.lproj *.m
11.判斷是否為iPad設(shè)備
if([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad){....}
12.Objective-C有哪幾種內(nèi)存管理方法腺阳?
  • MRR(Manual Retain Release) - MRC的官方名字落君;
  • MRC(Manual Reference Counting ) - 手動(dòng)引用計(jì)數(shù);
  • ARC(Automatic Reference Counting) - 自動(dòng)引用計(jì)數(shù)亭引;
  • GC(Garbage Collection) - 是垃圾回收(在開(kāi)發(fā)OS X中使用)
13.iOS中持久化方式有哪些绎速?
  • 屬性列表文件
  • 對(duì)象歸檔
  • SQLite數(shù)據(jù)庫(kù)
  • CoreData
14.關(guān)于類別的理解

類別是一種為現(xiàn)有的類添加新方法的方式。利用Objective-C的動(dòng)態(tài)運(yùn)行時(shí)分配機(jī)制焙蚓,Category提供了一種比繼承更為簡(jiǎn)潔的方法來(lái)對(duì)class進(jìn)行擴(kuò)展纹冤,無(wú)需創(chuàng)建對(duì)象類的子類就能為現(xiàn)有的類添加新方法,可以為任何已經(jīng)存在的class添加方法购公,包括那些沒(méi)有源代碼的類(比如某些框架類)赵哲,但不能刪除修改之前的方法。

類別主要有3個(gè)作用:

  • 可以將類的實(shí)現(xiàn)分散到多個(gè)不同文件或多個(gè)不同框架中君丁,方便代碼管理。也可以對(duì)框架提供類的擴(kuò)展(沒(méi)有源碼将宪,不能修改)绘闷。

  • 創(chuàng)建對(duì)私有方法的前向引用橡庞。如果其他類中的方法未實(shí)現(xiàn),在你訪問(wèn)其他類的私有方法時(shí)編譯器報(bào)錯(cuò)印蔗。這時(shí)使用類別扒最,在類別中聲明這些方法(不必提供方法實(shí)現(xiàn)),編譯器就不會(huì)產(chǎn)生警告华嘹。

  • 向?qū)ο筇砑臃钦絽f(xié)議:創(chuàng)建一個(gè)NSObject的類別成為“創(chuàng)建一個(gè)非正式協(xié)議”吧趣,因?yàn)榭梢宰鳛槿魏晤惖奈袑?duì)象使用。

15.NSRunLoop的以下描述錯(cuò)誤的是
A. RunLoop并不是由系統(tǒng)自動(dòng)控制的耙厚;
B.有3類對(duì)象可以被run loop監(jiān)控:sources强挫,timer,observers
C.線程是默認(rèn)啟動(dòng)run loop的;
D.NSTimer可手動(dòng)添加到新建的NSRunLoop中薛躬。

理解

  • A:Runloop的作用在于當(dāng)有事情要做時(shí)它使當(dāng)前的thread工作俯渤,沒(méi)有事情做時(shí)又使thread休眠。Runloop并不是由系統(tǒng)自動(dòng)控制的型宝,尤其是對(duì)那些新建的次線程需要對(duì)其進(jìn)行顯示的控制八匠。

  • B:有三類對(duì)象可以被run loop監(jiān)控,source趴酣,timer梨树,observers。

  • C:每一個(gè)線程都有自己的runloop岖寞,主線程是默認(rèn)開(kāi)啟的抡四,創(chuàng)建的子線程是要手動(dòng)開(kāi)啟的,因?yàn)镹SApplication只啟動(dòng)main application thread.

  • D:NSTimer默認(rèn)添加到當(dāng)前NSRunLoop中慎璧,也可以手動(dòng)指定添加到自己新建的NSRunLoop中床嫌。

16.常用的設(shè)計(jì)模式
  • 單例模式
  • 組合模式
  • 觀察者模式
  • 代理模式
  • 享元模式
  • 工廠方法模式
  • 抽象工廠模式
17.MVC的理解

數(shù)據(jù)管理者(M)、數(shù)據(jù)展示者(V)胸私、數(shù)據(jù)加工者(C)

  • M應(yīng)該做的事:
    • 給ViewController提供數(shù)據(jù)
    • 給ViewController存儲(chǔ)數(shù)據(jù)提供接口
    • 提供經(jīng)過(guò)抽象的業(yè)務(wù)基本組件厌处,供Controller調(diào)度
  • C應(yīng)該做的事:
    • 管理View Container的生命周期
    • 負(fù)責(zé)生成所有的View實(shí)例,并放入View Container
    • 監(jiān)聽(tīng)來(lái)自View與業(yè)務(wù)有關(guān)的事件岁疼,通過(guò)與Model的合作阔涉,來(lái)完成對(duì)應(yīng)事件的業(yè)務(wù)。
  • V應(yīng)該做的事:
    • 響應(yīng)與業(yè)務(wù)無(wú)關(guān)的事件捷绒,并因此引發(fā)動(dòng)畫效果瑰排,點(diǎn)擊反饋(如果合適的話,盡量還是放在View去做)等暖侨。
    • 界面元素表達(dá)
18.MVC和MVVM的區(qū)別
  • MVVM是對(duì)胖模型進(jìn)行的拆分椭住,其本質(zhì)是給控制器減負(fù),將一些弱業(yè)務(wù)邏輯放到VM中處理
  • MVC是一切設(shè)計(jì)的基礎(chǔ)字逗,所有新的設(shè)計(jì)模式都是基于MVC進(jìn)行的改進(jìn)
  • 補(bǔ)充:常見(jiàn)的設(shè)計(jì)模式有:MVC京郑、MVCS宅广、MVVM、viper
19.TCP和UDP有什么區(qū)別些举?
  • TCP是面向連接的跟狱,建立連接需要經(jīng)歷三次握手,保證數(shù)據(jù)正確性和數(shù)據(jù)順序
  • UDP是非連接的協(xié)議户魏,傳送數(shù)據(jù)受生成速度驶臊,傳輸帶寬等限制,可能造成丟包
  • UDP一臺(tái)服務(wù)端可以同時(shí)向多個(gè)客戶端傳輸信息
  • TCP報(bào)頭體積更大叼丑,對(duì)系統(tǒng)資源要求更多
20.TCP的三次握手
  • 第一次握手:客戶端發(fā)送syn包到服務(wù)器关翎,并進(jìn)入syn_send狀態(tài),等待服務(wù)器進(jìn)行確認(rèn)幢码;
  • 第二次握手:服務(wù)器收到客戶端的syn包笤休,必須確認(rèn)客戶的SYN,同時(shí)自己也發(fā)送一個(gè)SYN包,即SYN + ACK包症副,此時(shí)服務(wù)器進(jìn)入SYN_RECV狀態(tài);
  • 第三次握手:客戶收到服務(wù)器發(fā)送的SYN+ACK包之后店雅,向服務(wù)器發(fā)送確認(rèn)包,此包發(fā)送完畢,客戶端和服務(wù)器進(jìn)入ESTABLISHED狀態(tài)贞铣,完成第三次握手闹啦。
21.如何制作一個(gè)靜態(tài)庫(kù)/動(dòng)態(tài)庫(kù)?他們的區(qū)別是什么辕坝?
  • Xcode6支持制作靜態(tài)庫(kù)/動(dòng)態(tài)庫(kù)framework
  • 無(wú)論是動(dòng)態(tài)庫(kù)還是靜態(tài)庫(kù)都是區(qū)分真機(jī)和模擬器的
  • 靜態(tài)庫(kù)編譯靜態(tài)庫(kù)文件裝入程序空間窍奋,動(dòng)態(tài)庫(kù)是文件動(dòng)態(tài)裝入內(nèi)存
  • 動(dòng)態(tài)庫(kù)執(zhí)行到相關(guān)函數(shù)才會(huì)被調(diào)用,節(jié)省空間
  • 蘋果一般不允許第三方動(dòng)態(tài)庫(kù)酱畅,APP容易被拒
  • 一個(gè)lib包含了很多的架構(gòu)琳袄,會(huì)打到最后的包里么?
  • 不會(huì)纺酸,如果lib中有armv7, armv7s, arm64, i386,x86_64架構(gòu)窖逗,而target architecture選擇了armv7s,arm64,那么只會(huì)從lib中l(wèi)ink指定的這兩個(gè)架構(gòu)的二進(jìn)制代碼餐蔬,其他架構(gòu)下的代碼不會(huì)link到最終可執(zhí)行文件中碎紊;反過(guò)來(lái),一個(gè)lib需要在模擬器環(huán)境中正常link樊诺,也得包含i386架構(gòu)的指令

每一個(gè)設(shè)備都有屬于自己的CPU架構(gòu)
每一個(gè)靜態(tài)支持的架構(gòu)是固定

  • 模擬器

    • 4s-->5 : i386
    • 5s-->6plus : x86_64
  • 真機(jī)

    • 3gs-->4s : armv7
    • 5/5c : armv7s,靜態(tài)庫(kù)只要支持了armv7,就可以跑在armv7s的架構(gòu)上
    • 5s-->6plus : arm64

常用命令總結(jié):

使用lipo -info命令仗考,查看指定庫(kù)支持的架構(gòu),比如UIKit框架

lipo -info UIKit.framework/UIKit

想看的更詳細(xì)的信息可以使用lipo -detailed_info

lipo -detailed_info UIKit.framework/UIKit

還可以使用file命令

file UIKit.framework/UIKit

合并MyLib-32.a和MyLib-64.a词爬,可以使用lipo -create命令合并

lipo -create MyLib-32.a MyLib-64.a -output MyLib.a
22.支持64-bit后程序包會(huì)變大么秃嗜?

會(huì),支持64-bit后,多了一個(gè)arm64架構(gòu)痪寻,理論上每個(gè)架構(gòu)一套指令螺句,但相比原來(lái)會(huì)大多少還不好說(shuō)

23.用過(guò)Core Data或者SQLite嗎?讀寫是分線程的嗎橡类?遇到過(guò)死鎖沒(méi)?如何解決的芽唇?
  • 用過(guò)SQLite顾画,使用FMDB框架
  • 丟給FMDatabaseQueue或者 添加互斥鎖(NSLock/@synchronized(鎖對(duì)象))
24.APNS的原理:
  • 應(yīng)用在通知中心注冊(cè),由iOS系統(tǒng)向APNS請(qǐng)求返回設(shè)備令牌(device Token)
  • 應(yīng)用程序接收到設(shè)備令牌并發(fā)送給自己的后臺(tái)服務(wù)器
  • 服務(wù)器把要推送的內(nèi)容和設(shè)備發(fā)送給APNS
  • APNS根據(jù)設(shè)備令牌找到設(shè)備匆笤,再由iOS根據(jù)APPID把推送內(nèi)容展示
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末研侣,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子炮捧,更是在濱河造成了極大的恐慌庶诡,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,546評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件咆课,死亡現(xiàn)場(chǎng)離奇詭異末誓,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)书蚪,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,224評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門喇澡,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人殊校,你說(shuō)我怎么就攤上這事晴玖。” “怎么了为流?”我有些...
    開(kāi)封第一講書人閱讀 164,911評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵呕屎,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我敬察,道長(zhǎng)秀睛,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書人閱讀 58,737評(píng)論 1 294
  • 正文 為了忘掉前任静汤,我火速辦了婚禮琅催,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘虫给。我一直安慰自己藤抡,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,753評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布抹估。 她就那樣靜靜地躺著缠黍,像睡著了一般。 火紅的嫁衣襯著肌膚如雪药蜻。 梳的紋絲不亂的頭發(fā)上瓷式,一...
    開(kāi)封第一講書人閱讀 51,598評(píng)論 1 305
  • 那天替饿,我揣著相機(jī)與錄音,去河邊找鬼贸典。 笑死视卢,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的廊驼。 我是一名探鬼主播据过,決...
    沈念sama閱讀 40,338評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼妒挎!你這毒婦竟也來(lái)了绳锅?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 39,249評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤酝掩,失蹤者是張志新(化名)和其女友劉穎鳞芙,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體期虾,經(jīng)...
    沈念sama閱讀 45,696評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡原朝,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,888評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了彻消。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片竿拆。...
    茶點(diǎn)故事閱讀 40,013評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖宾尚,靈堂內(nèi)的尸體忽然破棺而出丙笋,到底是詐尸還是另有隱情,我是刑警寧澤煌贴,帶...
    沈念sama閱讀 35,731評(píng)論 5 346
  • 正文 年R本政府宣布御板,位于F島的核電站,受9級(jí)特大地震影響牛郑,放射性物質(zhì)發(fā)生泄漏怠肋。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,348評(píng)論 3 330
  • 文/蒙蒙 一淹朋、第九天 我趴在偏房一處隱蔽的房頂上張望笙各。 院中可真熱鬧,春花似錦础芍、人聲如沸杈抢。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 31,929評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)惶楼。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間歼捐,已是汗流浹背何陆。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 33,048評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留豹储,地道東北人贷盲。 一個(gè)月前我還...
    沈念sama閱讀 48,203評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像颂翼,于是被迫代替她去往敵國(guó)和親晃洒。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,960評(píng)論 2 355

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