前言
就最近兩週找工作的情況來看,市場對iOS工程師的需求並沒有因為經濟發展受阻而大幅減少,只是市場對iOS工程師的要求越來越高,像runtime、runloop和KVO等相關機制必須要爛熟於心。你若沒看過OC runtime的原始碼,而僅僅是死記硬背了一些面試題就拿到了Offer,只能說你很幸運,否則刷面試題直接去面試必定“凶多吉少”,建議在刷題的同時最後實現一遍。
對一些大廠來說,演算法和網路更是面試題的必考題,也是基礎中的基礎,同時也是讓之前沒有接觸過並想進入大廠的童鞋們最費時費力的兩個基礎。就網路的相關協議來說,啃一週的書也基本能拿下,也可以參考網路面試題,想加深印象可進行網路除錯。對於演算法,請參考這篇文章,或買本劍指Offer來學習。只是對於沒有演算法基礎的童鞋們,在篩選一些演算法題後,保守估計也需要兩週時間來消化,而且還很容易忘記,多練,多寫(手寫)以加深印象,然後記住其核心的演算法思路即可。
面試題
每個面試官都有自己擅長的技術棧或技術樹,所以不同的面試官會出不同的面試題,我們註定無法全部覆蓋,隱藏只能在我們有限的能力範圍內去了解或掌握更多相關知識點。以下根據面試題進行分門別類,你不知道或答不上來,不代表你能力不符,也不要有其它負面想法,更不要去追求掌握更多的面試題,因為沒有哪一份面試題能夠一勞永逸。相反,如果你非常善於某個方向(目前沒有哪個iOS開發者可以說精通iOS所有的framework吧?),也是用人單位非常看重且樂於接受的。
以下排名不分先後
物件導向的基礎題
- 物件導向的幾個設計原則?
- Hash表的實現?
- 什麼是程式和執行緒?有什麼區別?
- 記憶體的幾大區域?各自的職能?
- 架構、框架和設計模式的區別?
- MVC、MVVM和MVP架構的不同?
iOS基礎面試題
UI
- UIView和CALayer的區別?(CALayer的邏輯樹、動畫樹和顯示樹)
- loadView是幹嘛用的?
- layoutIfNeeded、layoutSubviews和setNeedsLayout的區別?
- iOS的響應鏈?什麼情況會影響響應鏈?
- 說幾種給UIImageView新增圓角的方式?
- iOS中實現動畫的方式有哪些?
- 使用drawRect有什麼影響?
OC基礎
- NS_ENUM和NS_OPTIONS的區別?
- iOS的記憶體管理機制?
- @property後的相關修飾詞有哪些?可變型別和不可變型別如何修飾?
- dynamic和synthesis的區別?
- array為何用strong修飾?mutableArray為何用copy修飾?
- 深拷貝和淺拷貝(注意NSString型別)?
- Block的幾種型別?
- isEqual和“==”的區別?
- id和NSObject的區別?
- 通知、代理、KVO和Block的不同(結合應用場景回答)?
- 什麼是迴圈引用?__weak、__strong和__block的區別?
- 記憶體洩漏、野指標和殭屍物件的區別?
- nil、Nil、NULL、NSNull的區別?
- static和const的區別?
- iOS中有哪些設計模式?
- 靜態庫和動態庫的區別?
- iOS中內省的幾個方法?
OC進階
- Foundation和CoreFoundation的轉換?
- array和set的區別?查詢速度和遍歷速度誰更快?
- 什麼是行內函數?為什麼需要它?
- 圖片顯示的過程?
- dispatch_once如何只保證只執行一次?
- NSThread、NSRunLoop和NSAutoreleasePool三者之間的關係?
- 分類可擴充套件的區別?(可從記憶體佈局、載入順序、分類方法和原類方法的執行順序來回答)
- OC物件是怎麼被釋放的?
- CDDisplayLink和NSTimer的區別?
- 用runtime實現方法交換有什麼風險?
runtime原始碼相關
- 知道AutoreleasePoolPage嗎?它是怎麼工作的?
- KVO的底層實現?(看過RAC原始碼的應該知道,RAC監聽方法也是基於此原理,只是稍微有些不同)
- 被weak修飾的物件是如何被置nil的?知道SideTable嗎?
- 什麼是關聯物件?可以用來幹嘛?系統如何管理管理物件?支援KVO嗎?
- isa、物件、類物件、元類和父類之間的關係?
- 知道建立類的方法objc_allocateClassPair?方法裡面具體做了什麼事情?
- class_ro_t 和 class_rw_t 的區別?
- 除了objc_msgSend,還知不知道別的訊息傳送函式?
- 什麼是方法交換?怎麼用的?
資料持久化
- plist
- NSUserDefault
- NSKeyedArchiver
- CoreData
- SQLite(FMDB、Realm)
多執行緒
- 序列佇列和併發佇列的區別?同步和非同步的區別?
- GCD和NSOperation的區別?
- 如何讓GCD的非同步佇列序列執行?
執行緒安全
- 如何保證執行緒安全?
- 什麼是死鎖?如何避免死鎖?
- 什麼是優先倒置?
專案經驗相關題
- 什麼時候重構?怎麼重構的?
- AppDelegate如何瘦身?
- 如何解決卡頓?
- 如何排查Crash?
- 如何檢測記憶體洩漏?有沒有遇到記憶體警告?怎麼解決的?
- 有何優化App啟動速度?(main前和main後)
開源庫
這部分主要跟簡歷中提到的相關庫有關,建議對簡歷中提到的開源庫,一定要有所準備。
SDWebImage
SDWebImage幾乎是每個iOS開發者都用過的開源庫,也是在簡歷中曝光度比較高的開源庫之一,同時也幾乎是面試都會問到的,所以要準備充分再去。
- 從呼叫到顯示的過程?
- 圖片是怎麼快取的?
- 怎麼避免重複下載同一個URL地址的圖片?
ReactiveCocoa
該庫比較複雜,可問的問題也非常多,以下僅供參考
- 冷熱訊號的區別?
- 如何監聽方法呼叫的?
- bind方法做了什麼?
- RAC中的RACObserver和KVO有什麼區別
- RAC的map和flattenMap的區別
工具
- Git、SVN?(問題可深可淺,淺:基本用法或相關命令,深:Git的工作原理)
- CocoaPods(pod update和pod install的區別)
- CI(持續整合、持續部署)
總結
除了跟同事或朋友一起創業,作為技術人員在找工作中,不管是HR面試還是技術面試,面試是不可避免的環節,所以我們如果很想加入某家公司,一定要做好充分的準備,保證一擊即中。以上面試題也是在學習、工作和麵試中積累的,肯定有很多沒覆蓋的部分,若大家有想補充的可以留言聯絡。以上所有題目的答案也都可以在網上搜尋到,我也提供了一份提示答案,以供大家參考。
另:在這個變化莫測的時代,大家要與時俱進,不要在舒適區待太久,祝大家都能找到滿意的工作。