面試是職場中必經的一個步驟,在短短的幾十分鐘內去考察一我的的各項能力與綜合素質,判斷候選人與團隊和團隊匹配程度。從技術角度來看,面試更像是針對某些知識的討論,尋求面試官和候選人的知識共通點,從而判斷候選人是否知足團隊須要。一個恰當的面試不是要難倒候選人,而是要引導候選人展現長處;從候選人熟悉的內容入手,考察技術細節和背後思考。 本文便談一談我對iOS面試的一些思考。面試
iOS的面試大體包括三大部分:基礎知識、項目經歷、代碼考察。數據庫
基礎知識能夠分爲: a.計算機基本知識:網絡原理、操做系統、編譯原理、數據結構、數據庫等; b.平臺相關知識:OC基礎、Runtime、內存管理、RunLoop、多線程、Xcode等;編程
項目經歷指的是作過的項目以及特定知識的積累,包括Crash分析、性能優化、持久化、代碼架構、Pod化、模塊化、組件化、持續集成等。設計模式
代碼考察是觀察候選人在遇到問題如何理解題目、分析問題、實現過程,一般一些解題思路有貪心、動態規劃、數據結構、遞歸、二分、排序等。瀏覽器
爲了切合iOS面試的主題,面試官一般都會從這一塊知識開始入手。OC的知識很是龐雜,有時候遇到熟悉的內容就很瞭解,若是沒有接觸過可能就沒有印象。好比說:viewDidLoad
的觸發時機是發生在何時?以及延伸的問題,viewDidLoad
與loadView的關係以及前後順序。性能優化
因此這部分知識,更合適問一些基礎、共性的問題。好比說:微信
ARC和MRC,iOS開發者須要對兩種內存管理方式都熟悉。一個瞭解MRC的開發者,遇到CF開頭的函數怎麼辦? 很常見的面試切入點是從ARC的實現原理開始,引入__strong/__weak/__unsafe_unretained/__autoreleasing
多個關鍵詞的區別,再聯想到循環引用,block實現原理,block持有外部的局部變量,autoReleasePool的使用,autoReleasePool與MRC的autorelease區別。markdown
以上是幾點是對基礎知識的一個簡單梳理,雖不全面也能提供一個學習方向。網絡
面試中遇到不會的知識點是很正常,只要能把本身所瞭解的知識徹底表達出來就很好。
有兩個亮點能夠培養:
一、廣度,方方面面的知識都涉及,特別是基礎知識要很牢固;
二、深度,對常見問題能深刻學習,經得起三、4次追問;數據結構
項目是能力的體現,實際項目中遇到的問題,能夠分爲幾大類。
性能測試是優化的前提,如何發現存在的性能問題?
數據庫是App必不可少的組成部分。
這是很是重要的一部分,沒有處理過Crash的iOS工程師,怎麼讓人相信其能力?
這是很是很差考察的一個方向,但一樣要有所準備。
根據每一個人的工做經歷,能夠挖掘本身進階部分的知識點:
簡單的以LeetCode爲標準,大部分公司的要求是在easy難度,進階要求也只到medium難度。
實際面試過程當中,多是長時間沒有作面試題而且沒有事先準備,也可能恰好考察到思惟盲區,能順利完成easy難度的題目都是百裏挑一。
作題並非爲了把題目解決,而是從作題過程去分析思考面試者遇到問題是如何思考解決,以及可否把代碼用實現想法。
選擇性針對某些考察點去用對應題目也是一種方向,好比說: 一、對於一個整數m,計算其二進制表示有多少個1,並分析其複雜度;
二、計算1~1000中,有多少個數字7;
三、有兩個很大的整數是用字符串來表示,實現一個函數加法,輸出這兩個字符串數字相加的結果;(大數加法)
...
分享一些作題要點:
一、快速理解題意,對於不清楚的條件及時提出疑問;
二、三思然後行,先分析題目考察點,再進行方案分析,最後作複雜度分析;
三、先講思路,再進行coding;
理想結果:
一、思路順暢,實現過程簡單清晰;
二、邊界處理完善,考慮周全;
三、代碼可讀性強,具備必定的抽象和擴展;
每一個面試官的經歷不一樣,所擅長的方向也不同。
求職者會海投,而公司招聘也是海選,面試官的面試也會比較多。若是面試中能有部分知識在深度或者廣度產生亮點,能夠給面試官留下深入的映象,從而更容易經過面試。
從個人視角去看iOS,把一些常見知識點給列出來:
題目只是一個引導,有經驗的面試官每每會追問更深層次的問題,做爲一個知識深度的考察。在根據上面的知識點去查漏補缺時,能夠適當選擇一些模塊,更深刻地去了解具體的實現。
好比說:ARC/MRC => weak/strong 區別 => 循環引用 => weak實現原理 => runtime源碼,不斷追問本身其中的實現,直到網上查不到資料。