前言
本文就是筆者認為可以用來面試高階 iOS 程式設計師的面試題。這套題的題目跟公司和業務都沒有關係,而且也並不代表本人可以把這些題回答得非常好,只是將一部分覺得比較好的題從收集的面試題裡面抽出來了而已。
本文分為兩個部分展開:
面試題
喜歡考察的和不喜歡考察的題
第一部分就是面試題了;第二部分給出了筆者喜歡考察和不喜歡考察的題以及原因。
面試題
iOS 基礎題
1.分類和擴充套件有什麼區別?可以分別用來做什麼?分類有哪些侷限性?分類的結構體裡面有哪些成員?
2.講一下atomic的實現機制;為什麼不能保證絕對的執行緒安全(最好可以結合場景來說)?
3.被weak修飾的物件在被釋放的時候會發生什麼?是如何實現的?知道sideTable麼?裡面的結構可以畫出來麼?
4.關聯物件有什麼應用,系統如何管理關聯物件?其被釋放的時候需要手動將其指標置空麼?
5.KVO的底層實現?如何取消系統預設的KVO並手動觸發(給KVO的觸發設定條件:改變的值符合某個條件時再觸發KVO)?
6.Autoreleasepool所使用的資料結構是什麼?AutoreleasePoolPage結構體瞭解麼?
7.講一下物件,類物件,元類,跟元類結構體的組成以及他們是如何相關聯的?為什麼物件方法沒有儲存的物件結構體裡,而是儲存在類物件的結構體裡?
8.class_ro_t 和 class_rw_t 的區別?
9.iOS 中內省的幾個方法?class方法和objc_getClass方法有什麼區別?
10.在執行時建立類的方法objc_allocateClassPair的方法名尾部為什麼是pair(成對的意思)?
11.一個int變數被__block修飾與否的區別?
12.為什麼在block外部使用__weak修飾的同時需要在內部使用__strong修飾?
13.RunLoop的作用是什麼?它的內部工作機制瞭解麼?(最好結合執行緒和記憶體管理來說)
14.哪些場景可以觸發離屏渲染?(知道多少說多少)
iOS 實戰題
1.AppDelegate如何瘦身?
2.反射是什麼?可以舉出幾個應用場景麼?(知道多少說多少)
3.有哪些場景是NSOperation比GCD更容易實現的?(或是NSOperation優於GCD的幾點,知道多少說多少)
4.App 啟動優化策略?最好結合啟動流程來說(main()函式的執行前後都分別說一下,知道多少說多少)
5.App 無痕埋點的思路瞭解麼?你認為理想的無痕埋點系統應該具備哪些特點?(知道多少說多少)
6.你知道有哪些情況會導致app崩潰,分別可以用什麼方法攔截並化解?(知道多少說多少)
7.你知道有哪些情況會導致app卡頓,分別可以用什麼方法來避免?(知道多少說多少)
網路題
1.App 網路層有哪些優化策略?
2.TCP為什麼要三次握手,四次揮手?
3.對稱加密和非對稱加密的區別?分別有哪些演算法的實現?
4.HTTPS的握手流程?為什麼金鑰的傳遞需要使用非對稱加密?雙向認證瞭解麼?
5.HTTPS是如何實現驗證身份和驗證完整性的?
6.如何用Charles抓HTTPS的包?其中原理和流程是什麼?
7.什麼是中間人攻擊?如何避免?
計算機系統題
1.瞭解編譯的過程麼?分為哪幾個步驟?
2.靜態連結瞭解麼?靜態庫和動態庫的區別?
3.記憶體的幾大區域,各自的職能分別是什麼?
4.static和const有什麼區別?
5.瞭解行內函數麼?
6.什麼時候會出現死鎖?如何避免?
7.說一說你對執行緒安全的理解?
8.列舉你知道的執行緒同步策略?
9.有哪幾種鎖?各自的原理?它們之間的區別是什麼?最好可以結合使用場景來說
設計模式題
1.除了單例,觀察者設計模式以外,還知道哪些設計模式?分別介紹一下
2.最喜歡哪個設計模式?為什麼?
3.iOS SDK 裡面有哪些設計模式的實踐?
4.設計模式是為了解決什麼問題的?
5.設計模式的成員構成以及工作機制是什麼?
6.設計模式的優缺點是什麼?
架構 & 設計題
1.MVC和MVVM的區別?MVVM和MVP的區別?
2.物件導向的幾個設計原則瞭解麼?最好可以結合場景來說。
3.可以說幾個重構的技巧麼?你覺得重構適合什麼時候來做?
4.你覺得框架和設計模式的區別是什麼?
5.看過哪些第三方框架的原始碼,它們是怎麼設計的?設計好的地方在哪裡,不好的地方在哪裡,如何改進?(這道題的後三個問題的難度已經很高了,如果不是太N的公司不建議深究)
資料結構&演算法題
1.連結串列和陣列的區別是什麼?插入和查詢的時間複雜度分別是多少?
2.雜湊表是如何實現的?如何解決地址衝突?
3.排序題:氣泡排序,選擇排序,插入排序,快速排序(二路,三路)能寫出那些?
4.連結串列題:如何檢測連結串列中是否有環?如何刪除連結串列中等於某個值的所有節點?
5.陣列題:如何在有序陣列中找出和等於給定值的兩個元素?如何合併兩個有序的陣列之後保持有序?
6.二叉樹題:如何反轉二叉樹?如何驗證兩個二叉樹是完全相等的?
喜歡出的和不喜歡出的題
不難看出,整套面試題中的iOS部分佔比其實並不大(三分之一),因為筆者認為:
高階 iOS 開發 = 高階開發 + (高階) iOS 開發。
而其中高階開發的部分應該作為優先考核的內容,目的在於首先要驗證面試者是否具備高階開發必備的基本素質。這部分知識的掌握程度會直接影響一個開發者的研究和設計能力,包括橫向和縱向的。而筆者個人覺得後面的(高階) iOS 開發的部分僅僅考查的是面試者對於 iOS 本身的理解程度(API,系統,開發工具等等)。
在這套裡面,個人最喜歡的幾道題是:
1.iOS SDK 裡面有哪些設計模式的實踐?
2.說一說你對執行緒安全的理解?
3.你知道有哪些情況會導致app崩潰,分別可以用什麼方法攔截並化解?
4.看過哪些第三方框架的原始碼,它們是怎麼設計的?
5.可以說幾個重構的技巧麼?你覺得重構適合什麼時候來做?
這道題一箭雙鵰,不僅考察了面試者對設計模式這種通用性知識的瞭解,還可以考察其對iOS SDK的熟悉和思考程度。這裡可以簡單提幾個:單例:UIApplication;觀察者模式:KVO;類簇:NSNumber;裝飾者模式:分類;命令模式:NSInvocation;享元模式:UITableviewCell(UITableview的重用)。還有更多,有興趣的讀者可以看一下《Objective-C 程式設計之道》這本書,它介紹了很多在 iOS SDK中使用的設計模式。
這道題我看到網上有些答案是錯的,說的大概的意思是“同一時刻只有一個執行緒訪問”。但是如果按照這個定義的話,那麼那些無法改變的常量就不算是執行緒安全的了,所以顯然這類定義就是錯的。所以說學東西要具備批判性思維,尤其是看部落格的時候,很多情況需要自己想想,主動去認證,去思考。
導致app崩潰的原因有很多,比如向某個物件傳送其無法響應的方法,陣列越界,集合類中新增nil物件,string訪問越界,KVO不合理的移除關聯key(KVO導致的崩潰不僅僅這一種原因)等。而崩潰非常影響使用者體驗,所以筆者認為一名高階 iOS 開發應該具備避免這些崩潰的能力,起碼至少也要知道這些容易導致崩潰的場景。
看一些優秀開源框架的程式碼,梳理實現思路和細節可以幫助我們提高在類似場景下設計系統的能力。其實道理很簡單,小時候學習寫作文的辦法是什麼?- 就是背誦課文而已啊。因為寫作是一種輸出,所以如果你沒有好詞好句的積累(輸入),自然寫不出辭藻豐富的文章。寫程式碼也是一樣的道理~
重構的能力是筆者非常看重的能力。其實筆者個人認為關於重構的技巧可以早早學習,在後面寫程式碼的時候儘可能做到一步到位(如果在排期允許的情況下),而且也對設計程式碼方面能力的提高有幫助:怎樣才能設計出一個低耦合,高內聚,易擴充套件,易修改的系統?有專門的一本書來介紹重構:《重構 改善既有程式碼的設計》。
上面說了筆者喜歡考察的問題,下面說一下筆者不喜歡考察的是哪些問題:
1.如何查詢線上的崩潰?
2.瞭解釋出流程麼?幾個證書的區別?
3.有沒有做過支付/地圖/分享?
4.dysm檔案是什麼,有什麼作用?
筆者不考察這類問題的原因有兩個:
1.這類問題考查不了面試者作為一名程式設計師的基本素質,因為其考察的內容僅僅侷限於iOS本身。
2.這類問題往往是“做過即知道”,更沒辦法量化能力。在實際開發中遇到了就做過了;就算沒遇到,沒做過,筆者也相信一名優秀的程式設計師在第一次也會高效地做好。
這套題就分享到這裡了,如果有疑問,並且需要更加詳細的面試題詳解,可以加iOS技術群:624212887 共同交流,謝謝大家的支援。