iOS面試題
作者:張之誠
首先需要聲明的是,此次的面試者大多在有1~3年的iOS開發(fā)經(jīng)驗(yàn),并非需要找一個(gè)真正的大牛,所以我準(zhǔn)備的題目,自己覺得大多數(shù)還是比較基礎(chǔ),比較能夠看出這個(gè)層次的人的水準(zhǔn)的。如果你也是個(gè)有3年左右開發(fā)經(jīng)驗(yàn)的從業(yè)者,不妨一試。
面試開始的時(shí)候,我會讓面試者選擇一個(gè)他最熟悉的項(xiàng)目,給我們介紹一下它的技術(shù)架構(gòu),以及面試者在其中參與的模塊和具體工作。因?yàn)槲冶救撕苡憛捗嬖嚿蟻碜鲎晕医榻B,所以我一般開門見山,直接開始講項(xiàng)目了。事實(shí)上,很多開發(fā)者并不明白我提到的“架構(gòu)”的具體意思,有些人說了一大堆產(chǎn)品的功能,還有人說的非常籠統(tǒng)(比如,遵循MVC架構(gòu)之類),一般這種時(shí)候我會打斷他們,直接讓他們給我講一下這個(gè)APP的層次結(jié)構(gòu),或者是核心模塊等。
之后我會問兩個(gè)問題:
1. 講述一次在這個(gè)APP中,用戶觸發(fā)了一個(gè)事件,引起了一個(gè)服務(wù)請求,然后獲取服務(wù)端返回,并且更新前端界面的過程。請說的詳細(xì)一點(diǎn),比如數(shù)據(jù)經(jīng)過了哪些類的處理,每一次傳遞時(shí)的格式是怎么樣的?
2. 你參與的APP,是如何處理多個(gè)服務(wù)的同步發(fā)起的?
隨后讓面試者說一下APP的界面架構(gòu),這個(gè)比較隨意。
問完了項(xiàng)目,就開始基礎(chǔ)知識題啦~
Model層:
數(shù)據(jù)持久化存儲方案有哪些?
沙盒的目錄結(jié)構(gòu)是怎樣的?各自一般用于什么場合?
SQL語句問題:inner join、left join、right join的區(qū)別是什么?
sqlite的優(yōu)化
網(wǎng)絡(luò)通信用過哪些方式(100%的人說了AFNetworking...)
如何處理多個(gè)網(wǎng)絡(luò)請求并發(fā)的情況
在網(wǎng)絡(luò)請求中如何提高性能
在網(wǎng)絡(luò)請求中如何保證安全性
語言與基礎(chǔ)知識:
內(nèi)存中的棧和堆的區(qū)別是什么?那些數(shù)據(jù)在棧上,哪些在堆上?
#define和const定義的變量,有什么區(qū)別
什么情況下會出現(xiàn)內(nèi)存的循環(huán)引用
block中的weak self,是任何時(shí)候都需要加的么?
GCD的queue,main queue中執(zhí)行的代碼,一定是在main thread么?
NSOperationQueue有哪些使用方式
NSThread中的Runloop的作用,如何使用?
.h文件中的變量,外部可以直接訪問么?(注意是變量,不是property)
講述一下runtime的概念,message send如果尋找不到相應(yīng)的對象,會如何進(jìn)行后續(xù)處理 ?
TCP和UDP的區(qū)別是什么?
MD5和Base64的區(qū)別是什么,各自場景是什么?
二叉搜索樹的概念,時(shí)間復(fù)雜度多少?
架構(gòu):(我們招的不是架構(gòu)師,這方面問的不多,而且從之前對APP的架構(gòu)介紹里可以邊聽邊問)
哪些類不適合使用單例模式?即使他們在周期中只會出現(xiàn)一次。
Notification的使用場景是什么?同步還是異步?
簡單介紹一下KVC和KVO,他們都可以應(yīng)用在哪些場景?
APP相關(guān):
如何添加一個(gè)自定義字體到工程中
如何制作一個(gè)靜態(tài)庫/動態(tài)庫,他們的區(qū)別是什么?
Configuration中,debug和release的區(qū)別是什么?
簡單介紹下發(fā)送系統(tǒng)消息的機(jī)制(APNS)
UI:
系統(tǒng)如何尋找到需要響應(yīng)用戶操作的那個(gè)Responder
多屏幕尺寸的適配
UIButton的父類是什么?UILabel呢?
push view controller 和 present view controller的區(qū)別
描述下tableview cell的重用機(jī)制
UIView的frame和bounds的區(qū)別是什么
最后是幾道場景題,也是我最喜歡問的:
發(fā)送10個(gè)網(wǎng)絡(luò)請求,然后再接收到所有回應(yīng)之后執(zhí)行后續(xù)操作,如何實(shí)現(xiàn)?
實(shí)現(xiàn)一個(gè)第三方控件,可以在任何時(shí)候出現(xiàn)在APP界面最上層
實(shí)現(xiàn)一個(gè)最簡單的點(diǎn)擊拖拽功能。
上面那個(gè)拖拽之外,如果在手放開時(shí),需要根據(jù)速度往前滑動呢?
如何減小一個(gè)應(yīng)用程序的尺寸?
如何提高一個(gè)性用程序的性能?
不同版本的APP,數(shù)據(jù)庫結(jié)構(gòu)變化了,如何處理?
平心而論,這些題目并沒有特別難,沒有講到黑科技,也沒有講到ACM算法題,都是iOS的基礎(chǔ)概念以及很容易遇到的場景。可能也是因?yàn)槲覀冋械哪繕?biāo),也只是一個(gè)可以完成業(yè)務(wù)開發(fā)的3年左右經(jīng)驗(yàn)的人而已,所以大部分面試者水平并不如意,能答出以上大半題目,同時(shí)思路清晰態(tài)度積極向上的人,不到四分之一吧...
另外的感想就是,這個(gè)行業(yè)可能真的有點(diǎn)浮躁,很多面試者,連簡單的幾個(gè)場景題都答不出來,基礎(chǔ)知識更是一般,只會用幾個(gè)第三方庫,就開口要25~30w的年薪,還有一種愛理不理的感覺。也有些人,在原來的公司,自稱是技術(shù)負(fù)責(zé)人,但連APP的基本架構(gòu),包括哪些主要模塊都講不清楚,各種兜圈子,甚至有人講了半天的產(chǎn)品功能和亮點(diǎn),我不得不一次次打斷才能繼續(xù)面試。
其實(shí)我從11年開始自學(xué)iOS,做的事情越多,越覺得自己有越多的東西要學(xué),離大牛的標(biāo)準(zhǔn)也是越來越遠(yuǎn)。而無論從深度還是廣度來看,iOS開發(fā)都是一個(gè)值得挖掘的技術(shù)領(lǐng)域。由于蘋果產(chǎn)品的火熱,市場上的iOS開發(fā)一直供不應(yīng)求,但真正有能力,高素質(zhì)的可能真的不那么多。