出一套 iOS 高級面試題

一千個讀者眼中有一千個哈姆雷特,一千名 iOS 程序員心目中就有一千套 iOS 高級面試題。本文就是筆者認爲能夠用來面試高級 iOS 程序員的面試題。git

這套題的題目跟公司和業務都沒有關係,並且也並不表明筆者本人能夠把這些題回答得很是好,筆者只是將一部分以爲比較好的題從收集的面試題裏面抽出來了而已。程序員

收集的面試題有如下三個來源:github

  1. 筆者在準備面試的過程當中蒐集並整理過的面試題。
  2. 筆者在準備面試的過程當中本身思考過的新題。
  3. 筆者在面試過程當中遇到的以爲比較好的題。

本文分爲三個部分展開:面試

  1. 面試題
  2. 喜歡考察的和不喜歡考察的題
  3. 建議準備數據結構和算法題

第一部分就是面試題了;第二部分給出了筆者喜歡考察和不喜歡考察的題以及緣由;第三部分是筆者建議你們準備數據結構和算法題的緣由。算法

面試題

iOS 基礎題

  1. 分類和擴展有什麼區別?能夠分別用來作什麼?分類有哪些侷限性?分類的結構體裏面有哪些成員?
  2. 講一下atomic的實現機制;爲何不能保證絕對的線程安全(最好能夠結合場景來講)?
  3. 被weak修飾的對象在被釋放的時候會發生什麼?是如何實現的?知道sideTable麼?裏面的結構能夠畫出來麼?
  4. 關聯對象有什麼應用,系統如何管理關聯對象?其被釋放的時候須要手動將全部的關聯對象的指針置空麼?
  5. KVO的底層實現?如何取消系統默認的KVO並手動觸發(給KVO的觸發設定條件:改變的值符合某個條件時再觸發KVO)?
  6. Autoreleasepool所使用的數據結構是什麼?AutoreleasePoolPage結構體瞭解麼?
  7. 講一下對象,類對象,元類,跟元類結構體的組成以及他們是如何相關聯的?爲何對象方法沒有保存的對象結構體裏,而是保存在類對象的結構體裏?
  8. class_ro_tclass_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. 能夠說幾個重構的技巧麼?你以爲重構適合何時來作?
  1. 這道題一舉兩得,不只考察了面試者對設計模式這種通用性知識的瞭解,還能夠考察其對iOS SDK的熟悉和思考程度。這裏能夠簡單提幾個:單例:UIApplication;觀察者模式:KVO;類簇:NSNumber;裝飾者模式:分類;命令模式:NSInvocation;享元模式:UITableviewCell(UITableview的重用)。還有更多,有興趣的讀者能夠看一下《Objective-C 編程之道》這本書,它介紹了不少在 iOS SDK中使用的設計模式。
  2. 這道題我看到網上有些答案是錯的,說的大概的意思是「同一時刻只有一個線程訪問」。可是若是按照這個定義的話,那麼那些沒法改變的常量就不算是線程安全的了,因此顯然這類定義就是錯的。因此說學東西要具有批判性思惟,尤爲是看博客的時候,不少狀況須要本身想一想,主動去認證,去思考。
  3. 致使app崩潰的緣由有不少,好比向某個對象發送其沒法響應的方法,數組越界,集合類中添加nil對象,string訪問越界,KVO不合理的移除關聯key(KVO致使的崩潰不只僅這一種緣由)等。而崩潰很是影響用戶體驗,因此筆者認爲一名高級 iOS 開發應該具有避免這些崩潰的能力,起碼至少也要知道這些容易致使崩潰的場景。
  4. 看一些優秀開源框架的代碼,梳理實現思路和細節能夠幫助咱們提升在相似場景下設計系統的能力。其實道理很簡單,小時候學習寫做文的辦法是什麼?- 就是背誦課文而已啊。由於寫做是一種輸出,因此若是你沒有好詞好句的積累(輸入),天然寫不出辭藻豐富的文章。寫代碼也是同樣的道理~
  5. 重構的能力是筆者很是看重的能力。其實筆者我的認爲關於重構的技巧能夠早早學習,在後面寫代碼的時候儘量作到一步到位(若是在排期容許的狀況下),並且也對設計代碼方面能力的提升有幫助:怎樣才能設計出一個低耦合,高內聚,易擴展,易修改的系統?有專門的一本書來介紹重構:《重構 改善既有代碼的設計》。

上面說了筆者喜歡考察的問題,下面說一下筆者不喜歡考察的是哪些問題:網絡

  1. 如何查詢線上的崩潰?
  2. 瞭解發佈流程麼?幾個證書的區別?
  3. 有沒有作過支付/地圖/分享?
  4. dysm文件是什麼,有什麼做用?

筆者不考察這類問題的緣由有兩個:

  1. 這類問題考查不了面試者做爲一名程序員的基本素質,由於其考察的內容僅僅侷限於iOS自己。
  2. 這類問題每每是「作過即知道」,更沒辦法量化能力。在實際開發中遇到了就作過了;就算沒遇到,沒作過,筆者也相信一名優秀的程序員在第一次也會高效地作好。

建議準備數據結構和算法題

在本文的最後說一下數據結構和算法題。

這類問題是比較大的公司喜歡考覈的內容,也就是說大部分公司其實並不考(可是若是瞭解的話是會加分的)。可是筆者我的認爲若是時間上容許,多少仍是準備一些會比較好。除了應對面試,其實算法方面的學習會對編程能力的提升有幫助,這一點筆者本身深有體會:

筆者此次準備面試的過程當中,在LeetCode上面刷了一些道題,其中鏈表,數組,二叉樹的題加起來有30道左右,並把這些題放在了我的倉庫裏面:awesome-algorithm-question-solution。歡迎PR Swift,Java的算法題和答案~

在刷題和學習的過程當中漸漸可以感受到對代碼的理解能力提升了不少,尤爲是鏈表題能夠強化對指針操做的理解,並且對執行條件的檢查,邊界問題的處理能力也提高了一些~

好了,這套題就分享到這裏了,在文章後面也建議你們平時注意數據結構和算法方面的學習。和上一篇同樣,這篇博客主觀方面的內容仍是多一些的,仍是但願讀者能夠多多和我交流~

本篇已同步到我的博客:出一套高級 iOS 面試題

筆者在近期開通了我的公衆號,主要分享編程,讀書筆記,思考類的文章。

  • 編程類文章:包括筆者之前發佈的精選技術文章,以及後續發佈的技術文章(以原創爲主),而且逐漸脫離 iOS 的內容,將側重點會轉移到提升編程能力的方向上。
  • 讀書筆記類文章:分享編程類思考類心理類職場類書籍的讀書筆記。
  • 思考類文章:分享筆者平時在技術上生活上的思考。

歡迎加入iOS開發交流學習羣,咱們一塊兒共同窗習,共同成長

相關文章
相關標籤/搜索