小米iOS開發面試4輪全記錄:Swift+底層原理深度考察
3年iOS開發社招小米4輪面試全記錄,含Swift內存管理、Runtime機制、Runloop原理、UI性能優化等真題詳解,小米iOS面試經驗2026最新分享。
背景介紹
先說下我的情況吧,3年iOS開發經驗,之前在一家教育科技公司做iOS端,主要負責課程直播和作業批改兩個核心模組。說實話在那邊待了三年,技術上到了一個瓶頸期,業務也比較穩定沒什麼新挑戰了,就開始看外面的機會。小米一直是我想去的公司,畢竟MIUI生態和iOS有很多可以借鑑的地方,而且小米在移動端的積累確實深厚。我是直接在小米官網投的履歷,大概等了兩週左右收到了HR的電話,約了第一輪面試。
整個面試流程一共4輪:一面技術基礎、二面進階原理+性能優化、三面架構設計+演算法、HR面。從一面到拿到offer大概用了三週時間,整體節奏還算緊湊。下面我按輪次詳細復盤一下。
一面:Swift基礎與內存管理
面試官風格
一面的面試官是個看起來很年輕的小哥,後來知道是小米iOS團隊的技術骨幹。風格偏務實,不太寒暄,上來就開問,但追問的時候會給你一些提示,不會讓你完全卡住。
Swift值類型 vs 引用類型
第一個問題就是Swift中值類型和引用類型的區別。這個我準備過,回答得比較流暢:值類型存儲在棧上,賦值時是深拷貝;引用類型存儲在堆上,賦值時是淺拷貝,多個變數指向同一塊內存。面試官追問了一個我沒想到的點:struct和class在方法調度上的區別。struct的方法調度是靜態的,編譯期確定;class的方法調度是動態的,通過vtable在運行時確定。這個點之前沒深入想過,還好面試官給了提示,我順著說了出來。
ARC原理與循環引用
接著問了ARC的工作原理。我講了引用計數的基本機制,編譯器在編譯期自動插入retain/release/autorelease調用,當引用計數降為0時自動釋放。面試官又問什麼情況下會出現循環引用,我舉了閉包捕獲self的經典例子,以及delegate用strong修飾的問題。面試官追問:除了閉包和delegate,還有哪些場景?我想了想說Timer的target-action也會造成循環引用,因為Timer會強引用target,這個他點了點頭。
weak和unowned的區別
這個是必考題了。weak是可選型的,對象釋放後自動置為nil;unowned是非可選型的,對象釋放後訪問會崩潰。我補充了使用場景:weak用於對象生命週期可能不一致的情況(如delegate),unowned用於對象生命週期確定一致的情況(如閉包和self同生同死)。面試官追問了一個細節:unowned和unowned(safe)的區別,這個我確實不太確定,老實說了不太了解,面試官簡單解釋了一下,Debug模式下unowned(safe)會做檢查,Release下和unowned(unsafe)行為一致。
Optional的本質
最後一個基礎題:Optional的底層實現。我回答Optional是一個枚舉,有兩個case:some(Wrapped)和none。面試官追問為什麼Swift要設計Optional,我講了類型安全的角度,null引用是「十億美元的錯誤」,Optional強制開發者處理nil情況,從語言層面避免了空指針問題。
一面感受
一面大概50分鐘,整體感覺還不錯,基礎題基本都答上了,unowned(safe)那個點沒答上來但面試官態度很好。當天晚上就收到了二面通知。
二面:Runtime、Runloop與性能優化
面試官風格
二面的面試官明顯資歷更深一些,應該是團隊負責人級別。問問題喜歡從場景出發,先給一個實際需求,然後一步步追問底層原理,壓力比一面大不少。
Runtime消息轉發機制
上來就問Runtime的消息轉發機制。這個我背過,但面試官要求我結合實際場景講。我說了完整的三步轉發流程:動態方法解析(resolveInstanceMethod)→ 快速轉發(forwardingTargetForSelector)→ 完整轉發(forwardInvocation)。面試官追問:你在專案中用過消息轉發嗎?我講了之前用forwardingTargetForSelector實現多繼承效果的案例,以及用resolveInstanceMethod動態添加方法的場景。他似乎比較滿意。
Runloop機制及應用
接著是Runloop的運行機制。我講了Runloop的本質是一個事件循環,不斷接收處理事件(Timer、Source、Observer)。面試官追問了幾個深入的問題:
1. Runloop的Mode是什麼?我回答Mode是Runloop的運行模式,不同Mode下只處理對應Mode的Source和Timer,比如滑動ScrollView時會切換到UITrackingRunLoopMode,此時NSDefaultRunLoopMode下的Timer不會觸發。
2. Runloop在實際開發中的應用?我講了三個場景:後台常駐線程(添加Port讓Runloop不退出)、性能優化(在kCFRunLoopBeforeSources和kCFRunLoopAfterWaiting之間監控卡頓)、延遲加載(performSelector:withObject:afterDelay依賴Runloop的Timer)。
UI卡頓優化
面試官給了一個場景:一個頁面滑動時明顯卡頓,你怎麼排查和優化?我按步驟回答:先用Instruments的Time Profiler定位耗時方法,再用CADisplayLink監控幀率,然後從幾個方向優化——主線程耗時操作移到子線程、減少視圖層級、避免頻繁佈局計算、圖片異步解碼預渲染。面試官追問:圖片解碼為什麼要異步?我講了UIImage在設置到UIImageView時才會觸發硬解碼,這個過程在主線程會阻塞UI,所以需要提前在子線程解碼好。
UITableView性能優化
最後問了UITableView的優化方案。我列了幾個:cell複用、高度緩存、異步繪製、減少subview層級、預排版預計算、按需加載。面試官追問了高度緩存怎麼實現,我講了用字典緩存cellHeight,在heightForRowAtIndexPath中先查緩存,沒有再計算並緩存。
二面感受
二面大概1小時,被追問得有點緊張,尤其是Runloop的應用場景那塊,有些細節沒答好。但面試官一直在引導,沒有讓我完全卡住。三天後收到了三面通知。
三面:架構設計與演算法
面試官風格
三面的面試官應該是技術總監,問的問題更宏觀,關注架構思維和系統性思考,不像前兩面那麼摳細節。
專案架構設計
先讓我介紹當前專案的架構。我講了專案用的MVC架構,但存在Massive ViewController的問題,後來逐步引入MVVM。面試官追問:MVVM和MVC的核心區別是什麼?我回答MVVM將業務邏輯從Controller抽到ViewModel,Controller只負責視圖綁定和生命週期管理,ViewModel可測試性更強。面試官又問:你專案中MVVM的綁定方式是什麼?我講了用Combine框架做響應式綁定,以及之前用KVO的方式。
組件化方案
面試官問你對iOS組件化的理解。我講了組件化的核心是解耦,通過中間層(Router或Protocol)實現模組間通信。我提到了三種方案:URL Router(蘑菇街方案)、Target-Action(CTMediator)、Protocol-Class註冊(BeeHive),並分析了各自的優缺點。面試官追問:你們專案用的哪種?為什麼?我講了用的CTMediator方案,因為不需要註冊表,運行時解耦更徹底,雖然硬編碼字串有風險但可以通過工具生成。
CI/CD流程
面試官問你們專案的CI/CD是怎麼做的。我講了用Jenkins + Fastlane搭建的自動化打包流程,包括代碼檢查(SwiftLint)、單元測試、打包分發(fir.im)、自動上傳TestFlight。面試官追問:Fastlane的match命令是做什麼的,我回答是統一管理證書和描述檔,避免多人協作時證書管理混亂。
演算法題
演算法部分兩道題:
1. 二叉樹的最大深度:遞迴解法,max(depth(left), depth(right)) + 1,幾分鐘就寫完了。面試官讓改成迭代解法,我用BFS層序遍歷實現。
2. 鏈表排序:要求O(nlogn)時間複雜度和O(1)空間複雜度。我用了歸併排序,先找中點(快慢指針),再遞迴排序,最後合併有序鏈表。寫的時候有個小bug,合併時忘記處理剩餘節點,面試官指出來了,我快速修正。
三面感受
三面大概1小時10分鐘,架構部分聊得比較深入,演算法題難度適中。整體感覺面試官更看重思路和思考過程,不是死摳答案。一週後收到了HR面通知。
HR面:動機與規劃
HR面比較輕鬆,主要問了幾個問題:
1. 為什麼來小米?我講了小米在移動端的積累深厚,MIUI和iOS有很多技術交叉點,而且小米的工程師文化我很認同,務實不浮誇。
2. 職業規劃?我說短期希望在iOS底層技術上深耕,長期希望能帶團隊,從技術和管理兩個維度成長。
3. 薪資期望?我給了一個合理的範圍,沒有獅子大開口,也表明了可以協商的態度。
4. 有沒有其他offer?如實回答了有另一個在流程中的,但小米是首選。
面試真題彙總
Swift基礎
1. 值類型與引用類型的區別?struct和class方法調度的區別?
2. ARC的工作原理?循環引用的場景有哪些?
3. weak和unowned的區別?unowned(safe)和unowned(unsafe)的區別?
4. Optional的本質是什麼?Swift為什麼要設計Optional?
底層原理
5. Runtime消息轉發機制的完整流程?
6. Runloop的運行機制?Mode是什麼?實際應用場景?
7. UI卡頓的排查和優化方案?
8. UITableView性能優化方案?高度緩存怎麼實現?
架構與工程化
9. MVVM和MVC的核心區別?綁定方式有哪些?
10. iOS組件化方案有哪些?各自的優缺點?
11. CI/CD流程怎麼搭建?Fastlane match的作用?
演算法
12. 二叉樹的最大深度(遞迴+迭代)
13. 鏈表排序(歸併排序,O(nlogn)時間O(1)空間)
心得體會與建議
1. 基礎要扎實,但更要理解原理。小米的面試不會只問你「是什麼」,而是會追問「為什麼」和「怎麼用」。比如Optional,大家都知道是枚舉,但為什麼要這樣設計?這背後是語言設計的哲學思考。
2. 性能優化是加分項。二面的卡頓排查和UITableView優化,如果你能從監控→定位→優化的完整鏈路來講,面試官會覺得你有實戰經驗,而不只是背八股文。
3. 架構設計要結合專案講。不要只說理論,一定要結合自己專案中的實際案例,講清楚為什麼選擇這個方案、遇到了什麼問題、怎麼解決的。
4. 演算法不能丟。雖然iOS面試演算法佔比不高,但三面還是會考,而且要求不低。鏈表排序那道題空間複雜度要求O(1),直接排除了遞迴歸併的寫法,必須用迭代。
5. 面試心態很重要。二面被追問的時候確實有點緊張,但我發現面試官追問不是為了難為你,而是想看你的思考過程。答不上來的不要硬編,說「我不太確定,但我的理解是...」比瞎編要好得多。
常見問題FAQ
Q1:小米iOS面試看重專案經驗還是基礎原理?
兩者都看重,但側重點不同。一面偏基礎原理,二面偏實戰和性能優化,三面偏架構思維。專案經驗是載體,基礎原理是內核,缺一不可。
Q2:沒有大廠經驗,小米面試會被歧視嗎?
不會。我之前也是中小公司,面試官關注的是你解決問題的能力和技術深度,而不是公司背景。把專案中的亮點講清楚比公司名頭更有說服力。
Q3:演算法要準備到什麼程度?
LeetCode中等難度為主,重點掌握鏈表、樹、動態規劃這幾類。小米的演算法題不會特別偏,但會要求你分析時間和空間複雜度,並且可能讓你優化。
Q4:面試週期大概多久?
我整個流程大概三週,一面到二面3天,二面到三面3天,三面到HR面1週,HR面到offer 3天。不同部門可能不一樣,供參考。
Q5:薪資大概什麼水平?
3年經驗iOS開發,小米給的薪資在行業內屬於中上水平,具體就不透露了。建議面試前先了解市場行情,給自己定一個合理的期望範圍。