前言
就最近兩週找工做的狀況來看,市場對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面試仍是技術面試,面試是不可避免的環節,因此咱們若是很想加入某家公司,必定要作好充分的準備,保證一擊即中。以上面試題也是在學習、工做和麪試中積累的,確定有不少沒覆蓋的部分,若你們有想補充的能夠留言聯繫。以上全部題目的答案也均可以在網上搜索到,我也提供了一份提示答案,以供你們參考。架構
另:在這個變化莫測的時代,你們要與時俱進,不要在溫馨區待過久,祝你們都能找到滿意的工做。併發