iOS面試小結

前言

面試是職場中必經的一個步驟,在短短的幾十分鐘內去考察一我的的各項能力與綜合素質,判斷候選人與團隊和團隊匹配程度。從技術角度來看,面試更像是針對某些知識的討論,尋求面試官和候選人的知識共通點,從而判斷候選人是否知足團隊須要。一個恰當的面試不是要難倒候選人,而是要引導候選人展現長處;從候選人熟悉的內容入手,考察技術細節和背後思考。 本文便談一談我對iOS面試的一些思考。面試

正文

iOS的面試大體包括三大部分:基礎知識、項目經歷、代碼考察數據庫

基礎知識能夠分爲: a.計算機基本知識:網絡原理、操做系統、編譯原理、數據結構、數據庫等; b.平臺相關知識:OC基礎、Runtime、內存管理、RunLoop、多線程、Xcode等;編程

項目經歷指的是作過的項目以及特定知識的積累,包括Crash分析、性能優化、持久化、代碼架構、Pod化、模塊化、組件化、持續集成等。設計模式

代碼考察是觀察候選人在遇到問題如何理解題目、分析問題、實現過程,一般一些解題思路有貪心、動態規劃、數據結構、遞歸、二分、排序等。瀏覽器

1、基礎知識

一、Objective-C基礎

爲了切合iOS面試的主題,面試官一般都會從這一塊知識開始入手。OC的知識很是龐雜,有時候遇到熟悉的內容就很瞭解,若是沒有接觸過可能就沒有印象。好比說:viewDidLoad 的觸發時機是發生在何時?以及延伸的問題,viewDidLoad 與loadView的關係以及前後順序。性能優化

因此這部分知識,更合適問一些基礎、共性的問題。好比說:微信

  • 常見的property有哪些屬性?各自的屬性應用場景有哪些?
  • 介紹KVO和KVC的區別?KVO是否會引發循環引用?若是觀察對象已經釋放,會致使什麼現象?用NSNotification 替代KVO,觀察對象已釋放會如何?如何手動實現KVO?
  • 如何建立一個字符串常量?在.h聲明而且實現會有什麼問題?
  • category和extension的區別?category的實現原理?extension是否能夠和category寫在同一個文件?
二、內存管理

ARC和MRC,iOS開發者須要對兩種內存管理方式都熟悉。一個瞭解MRC的開發者,遇到CF開頭的函數怎麼辦? 很常見的面試切入點是從ARC的實現原理開始,引入__strong/__weak/__unsafe_unretained/__autoreleasing多個關鍵詞的區別,再聯想到循環引用,block實現原理,block持有外部的局部變量,autoReleasePool的使用,autoReleasePool與MRC的autorelease區別。markdown

三、Runtime
  • Runtime機制介紹;
  • 介紹isa、屬性列表、方法列表、協議列表;
  • 消息傳遞機制如何查找方法;
  • Category實現原理;
  • method swizzling原理;
  • imp和selector;

四、RunLoop

  • unloop概述;
  • 與線程的關係;
  • 與FPS的關係;
  • RunLoop的實際應用;
五、iOS系統
  • 介紹scheme原理;
  • 微信如何實現呼起第三方app?網頁又如何呼起APP?
  • Push通知實現原理?客戶端A直接向客戶端B發Push是否可行?
  • 代碼簽名;
  • 沙盒機制;
  • 地址空間隨機化;
六、編譯原理
  • 介紹整個編譯的流程;
  • 靜態庫、動態庫的區別;
  • 靜態鏈接、動態連接的過程和區別;
  • 在VC.h文件引入VC+Test.h(Category)會如何;
七、多線程
  • 多線程有哪些實現方式 ?
  • pthread、NSThread、GCD、NSOperationQueue有哪些應用場景?
  • 多線程如何進行線程同步?
  • 信號量、鎖、代碼塊、原子變量常見有哪些應用場景?
  • 實現一個變量的讀寫鎖:讀共享,寫互斥;
  • 如何用GCD實現100個任務執行,可是最高併發爲10個任務?
  • GCD和線程的關係?GCD併發隊列的線程爆炸?
八、網絡原理
  • 介紹TCP三次握手?
  • socket編程中,什麼時候進行三次握手?如何用socket發送數據?
  • HTTP協議中request和response有哪些數據組成部分?
  • 在瀏覽器輸入URL到頁面加載發生了什麼?
  • HTTP斷點續傳;
  • HTTP中間人攻擊;(重點)
  • HTTPS實現原理;(加密通訊原理)
  • HTTPS中間人攻擊;
  • DNS劫持;
九、Xcode
  • LLDB調試技巧:如何查看堆棧、修改內存、監控內存值變化、執行語句;
  • Xcode中的scheme配置是什麼?
  • General中的Project和Target用處?
  • Certificate、Provisioning Profile、App ID的關係;
  • Image Assets Catalogs是什麼?

以上是幾點是對基礎知識的一個簡單梳理,雖不全面也能提供一個學習方向。網絡

面試中遇到不會的知識點是很正常,只要能把本身所瞭解的知識徹底表達出來就很好。
有兩個亮點能夠培養:
一、廣度,方方面面的知識都涉及,特別是基礎知識要很牢固;
二、深度,對常見問題能深刻學習,經得起三、4次追問;數據結構

2、項目經歷

項目是能力的體現,實際項目中遇到的問題,能夠分爲幾大類。

一、性能優化

性能測試是優化的前提,如何發現存在的性能問題?

  • 怎麼監控FPS下降?如何監控內存、CPU、GPU、加載速度、磁盤、崩潰等等;
  • 如何進行電量優化?
  • Xcode 有哪些工具能夠進行檢查?
  • UITableView如何進行優化?
  • 圖片加載/下載的過程?怎麼優化加載速度和內存佔用?
二、持久化

數據庫是App必不可少的組成部分。

  • 常見的數據庫有哪些選擇?
  • 如何處理數據庫的版本遷移、損壞保護、體積控制、大小統計?
  • 序列化和反序列化;
三、Crash分析
  • 崩潰日誌的地址如何還原成代碼?
  • 舉一個最近遇到的崩潰,如何發現、定位、解決;
  • 常見Crash類型有哪些?

這是很是重要的一部分,沒有處理過Crash的iOS工程師,怎麼讓人相信其能力?

四、代碼架構

這是很是很差考察的一個方向,但一樣要有所準備。

  • 常見的設計模式有哪些?舉個具體應用例子;
  • App的網絡層如何設計?任務併發、回調處理、任務取消等;
  • MVVM是什麼?有什麼特色?
  • MVC框架怎麼保證VC代碼不膨脹?
五、進階知識點

根據每一個人的工做經歷,能夠挖掘本身進階部分的知識點:

  • 逆向;
  • Pod庫實現組件化;
  • 跨平臺:ReactNative、hybrid封裝、jsbridge;
  • 持續繼承CI:腳本能力,工程理解;
  • 質量體系:各類監控,實時告警處理;
  • 音視頻相關:AudioUnit、OpenGL ES、GPUImage、Metal、AVFoundation;

3、代碼考察

簡單的以LeetCode爲標準,大部分公司的要求是在easy難度,進階要求也只到medium難度。
實際面試過程當中,多是長時間沒有作面試題而且沒有事先準備,也可能恰好考察到思惟盲區,能順利完成easy難度的題目都是百裏挑一。
作題並非爲了把題目解決,而是從作題過程去分析思考面試者遇到問題是如何思考解決,以及可否把代碼用實現想法。

選擇性針對某些考察點去用對應題目也是一種方向,好比說: 一、對於一個整數m,計算其二進制表示有多少個1,並分析其複雜度;
二、計算1~1000中,有多少個數字7;
三、有兩個很大的整數是用字符串來表示,實現一個函數加法,輸出這兩個字符串數字相加的結果;(大數加法)
...

分享一些作題要點:
一、快速理解題意,對於不清楚的條件及時提出疑問;
二、三思然後行,先分析題目考察點,再進行方案分析,最後作複雜度分析;
三、先講思路,再進行coding;

理想結果:
一、思路順暢,實現過程簡單清晰;
二、邊界處理完善,考慮周全;
三、代碼可讀性強,具備必定的抽象和擴展;

總結

每一個面試官的經歷不一樣,所擅長的方向也不同。
求職者會海投,而公司招聘也是海選,面試官的面試也會比較多。若是面試中能有部分知識在深度或者廣度產生亮點,能夠給面試官留下深入的映象,從而更容易經過面試。

從個人視角去看iOS,把一些常見知識點給列出來:

題目只是一個引導,有經驗的面試官每每會追問更深層次的問題,做爲一個知識深度的考察。在根據上面的知識點去查漏補缺時,能夠適當選擇一些模塊,更深刻地去了解具體的實現。
好比說:ARC/MRC => weak/strong 區別 => 循環引用 => weak實現原理 => runtime源碼,不斷追問本身其中的實現,直到網上查不到資料。

相關文章
相關標籤/搜索