基本情況
- 本人從七月下旬開始實習跑路,回到學校準備秋招,一開始海投了大概四五十家公司,前期收到面試的公司基本都收到了意向書或offer,包括阿里,百度,猿輔導等等。fail掉的公司為騰訊,二面掛後轉崗到騰訊北京,後放棄面試。後決定好自己去向之後基本沒有再繼續面試,也推了十幾家公司的面試邀請,包括美團,貝殼,快手等。個人秋招在八月下旬基本結束,現在希望把自己在秋招的面試經驗總結出來,幫助更多的小夥伴。
通用必備基礎知識
- 拋開iOS 開發這一項技能,我們最基礎的本質還是一名軟體開發工程師,所以基礎的部分必不可少,本篇面經中,不會具體總結出每個公司每一面具體考的內容,而是會根據不同的知識點將面試真題分為不同的專題部分來具體分析。
計算機網路
-
對於大前端類,計算機網路主要考量的還是傳輸層和應用層部分的知識。
-
瀏覽器輸入url到網頁顯示經歷了什麼過程?
-
TCP三次握手:具體是怎麼握手?為什麼要三次握手?兩次行不行?為什麼不行?三次握手,第二次和第三次分別因為什麼?
-
TCP是如何保持可靠傳輸的(擁塞控制,慢啟動等等概念的理解)
-
TCP為什麼要四次揮手,TIME_WAIT為什麼至少設定兩倍的MSL時間?
-
TCP三次握手的詳細資料傳遞,四次揮手詳細資料內容,資料包組成、TIME_WAIT狀態,2MSL,RTT,重傳、滑動視窗、擁塞原理等等
-
TCP、UDP面向連線、無連線具體理解,他們的區別,如何將 UDP 改造成和 TCP 功能相似
-
TCP/IP四層協議,OSI七層協議,每層都有啥對應的協議,原理是啥
-
http報文結構,http中超文字超是啥意思,http請求的組成
-
http 報文頭部含有什麼,multipart瞭解嗎
-
http的狀態碼,200,304,301,http請求報文,響應報文
-
get和post請求的區別?什麼情況下用到?POST傳輸的資料都有哪些格式呢(這裡需要搞定http各種請求傳輸的資料格式)
-
描述一次完整的http請求
-
什麼是cookie,什麼是session,區別聯絡,cookie的本質是什麼
-
http1.0,1.1,2.0的區別
-
https有幾次握手和揮手?https的原理。http有幾次揮手和握手?TLS在哪一網路層,基本原理是什麼?
-
https與中間人攻擊
-
HTTPS,安全層除了SSL還有,最新的? 引數握手時首先客戶端要發什麼額外引數
-
HTTPS是什麼?握手過程,SSL原理,非對稱加密瞭解多少
-
證照是幹什麼用的
演算法
- 劍指 offer 上面的題目都是面試過程中的演算法高頻題,特別是二叉樹和字串,棧佇列,連結串列,跳臺階問題一定要弄懂並且熟練。
- 八大排序演算法的複雜度,概念,最好最壞情況,手寫都是必須要掌握的,其中的重點是快排和堆排序,對於快排的優化,快排的基礎原理,系統 API 快排的實現原理等都是必須要掌握的基礎知識。
- 二分查詢在面試過程中也比較常見,因為比較簡單,包括二分查詢的變種。
- 二叉樹的前中後序的遞迴與非遞迴遍歷方式,以及層序遍歷和蛇形遍歷都是重點。
- 海量資料如何找到重複次數最多的那個 優化
- 海量資料,但是都是1~100之間的,如何找到重複次數最多的那個
- 面試演算法題一般不難,掌握技巧很重要。二叉樹相關的演算法題基本都要往二叉樹的遍歷上靠,連結串列相關的演算法題基本都要往額外的“幫助指標”上面靠。
資料結構
- 在面試過程中這一類主要是和演算法來一起考,資料結構一般主要會問棧與堆的區別,棧與佇列的區別等等,在前端的面試中,紅黑樹這類的很少被問到。
編譯原理
- 主要需要了解程式的編譯過程的基礎概念就OK。
作業系統
- 作業系統老生常談的就是程式,執行緒的概念和區別,幾個狀態,以及他們的排程方式,通訊方式,保持安全等等知識點,基本面試都會被考到一點,這一部分需要牢牢掌握,實在理解不了就背下來。
- 說說遞迴和普通的迴圈方式有什麼區別
- 計算機儲存系統是指?哪些儲存系統能提高程式執行的效率?
- 段錯誤和棧溢位分別在什麼時候會出現,為什麼
- 其他方面的包括頁置換等等基礎知識,知道概念就OK,在前端面試過程中這部分不是特別重點考量的點。
資料庫
- 資料庫這部分也比較簡單,主要就是 ACID 等基礎概念,幾大正規化,簡單的 sql 語句。
設計模式
- 工廠方法,抽象工廠,簡單工廠的區別和聯絡
- 裝飾者
- 觀察者
- 代理模式等等
概率論
- 三門問題
- 紅黑球等等常見問題百度即可
Linux
- 主要包括基本的 shell 程式設計,基本的指令碼命令,重點是 grep,ps,top,free等
版本控制
- 版本控制主要包括 Git 和 SVN
- git 的基礎概念,基本命令,包括 merge 和 rebase 的區別等。
- Git 和 SVN 的區別,異同點
- 平時開發中,版本控制的流程是怎麼樣的
通用語言基礎
- 物件導向的多型。多型的幾種方式
- 各個語言中的單例模式
- 記憶體管理方式
- static 和 const 的作用和區別
- C 語言的記憶體分段
iOS專業知識點
- iOS 的面試過程中,雖然知識點很多很雜,但是老生常談的還是那些比較陳舊的知識,只要對他們有較好的理解,通過面試一般不成問題。
記憶體管理
- ARC 和 MRC 的區別
- 屬性的關鍵字,他們具體的底層實現以及區別,被問爛的知識點包括 copy, 淺拷貝和深拷貝的區別, weak 的底層實現。稍微新穎一點的 assgin 和 weak,unsafe_unretained 具體有什麼區別,assgin是否可以用來修飾物件。這一部分是面試必問,一定要弄懂。
- Autorelease pool的底層實現原理,與 Runloop 的關係, autoreleasing 關鍵字。
Block
- 本質,基礎概念
- 使用時要注意的地方
- block的實現,如何截獲自動變數的,如何修改自動變數的值的,block的幾種形式
- __block的本質
- forwarding 指標
- block怎麼避免迴圈引用。是不是所有的block都會產生迴圈引用,block裡面怎麼避免被提前釋放
多執行緒
- iOS 中多執行緒的幾種方式,區別,使用場景,基本概念,同步非同步,序列並行的區別。
- GCD,寫一個死鎖,並行和序列佇列,同步和非同步的區別,GCD怎麼控制最大併發數
- 怎麼讓子執行緒定時執行一個方法,具體的實現方法
- 如何控制執行緒的最大併發數為10,然後載入十個圖片最後展示出來,具體方法
- 子執行緒的runloop是怎麼執行的,它裡面的 autoreleasepool 是怎麼執行的。
- NSMutableArray 怎麼保證執行緒安全的。
- GCD怎麼避免block中的變數被提前釋放
Runtime
- 訊息的動態轉發
- 給 Category 新增屬性,關聯物件都有幾種形式
- method swizzling
- 說一說類的結構,執行時中的class都有什麼屬性,property都有什麼屬性
- 說一說isa指到NSObject的那個過程
- Category的本質,load方法什麼時候載入,Category重寫了父類的方法會怎樣,底層原始碼 ,如果兩個Category和一個基類,都有同名方法,先執行哪個
- property會自動生成什麼,如果此時已經有下劃線_name的例項變數了那會生成什麼
- load 和 initialize
Runloop
-
runloop實現原理
-
source 型別
-
執行緒保活的方式
-
runloop和多執行緒的關係,以及timer的關係
第三方庫的原始碼
- AFNetWorking, SDWebImage,YYModel 都是非常常見,基本面試必問
- 舉例:SDWebImage懟原始碼,實現原理,如果正在請求一個地址的圖片,這個時候又同時另一個請求,這個時候會再傳送一個請求嗎?
- 如何自己實現一個 YYModel,具體使用的方法,延伸到 runtime 的原始碼
生命週期
- app 的生命週期
- 控制器的生命週期
- 檢視的生命週期
UI
- UICollectionView 瀑布流
- UITableView 相關的優化,底層原理等
- 頁面佈局
- layoutSubViews 和 drawInRect 等的區別
- 自己實現一個 UIScrollView
- 事件的傳遞鏈和響應鏈
- 介面非常卡頓怎麼定位到具體的類和方法
- UIView和CALayer區別
資料儲存
- 資料持久化都有什麼,用過什麼,歸檔,偏好設定都可以儲存什麼樣的型別
架構
- MVC,MVVM等,他們的區別和聯絡,優缺點
- 從 0 到 1 實現一個 app 的思路
- 對於專案從 main 函式執行之前到之後啟動優化,卡頓優化和介面優化。
OC 語言特性
- OC 與 C 的區別, OC 與 Java, C++ 的區別。
- iOS中的協議
- OC 動態性
- C語言如何動態的交換兩個方法的實現
其他
- KVO 的底層原理,自己實現
- KVC 的底層原理,自己實現
- NSNotificationCenter 的底層原理,是同步還是非同步,如何實現一個,如果在子執行緒接收一個通知能不能接收到
- 幾種頁面傳值方式的區別
- 介面非常卡頓怎麼定位到具體的類和方法
- 一個 int 型別的值,被@(10) 包裝成 NSNumber 型別,傳遞到一個接受 id 型別的方法引數中,這個值能不能保持正確
- 在 iPad 上面,分屏功能,拖拽 wps 的檔案到qq的這個過程是怎麼實現的(程式間通訊的方法)
- 如何實現dispatch_once
- Instrument 的使用
- 熱修復用過麼,平時版本是怎麼迭代的,線上bug是怎麼修復的
- 實習期的一些內容。
必備書單
- 圖解 TCP/IP, 圖解 HTTP
- 劍指offer
- Effective Objective-C
- iOS 與 OSX 高階程式設計
- 以上都是必須要重複看很多遍的書單,其他不太重要的暫不列出。
總結
- 對於秋招來說,由於面向的都是學生,所以主要還是考量的基礎,最最重要的包括計算機網路和資料結構演算法。對於iOS 開發的同學來說,上面已經包括了大部分我面試中遇到的點以及我認為非常重要的知識點,希望我的面經能給大家帶來一些幫助!
另:歡迎大家參加掘金技術正文大賽? 秋招求職時,寫文就有好禮相送 | 掘金技術徵文 - 掘金