前言
年前沒有太多時間學習,面試百度、美團到三面就被刷下來了!
疫情期間啃完了這份美團大佬整理的iOS核心知識點,也看了不少馬士兵老師的視訊,本想着去試試,就面試了阿裡,沒想到竟拿到了offer,定級P7
阿裡的面試經曆
先介紹了項目,然後問了一些項目中的問題,然後開始問基礎
屬性的關鍵字
淺拷貝和深拷貝的差別
Block的循環引用、如何解決、原理
三種Block
Block和delegate的比較
kvo的實作原理
Autorelease pool的實作原理
消息轉發機制
線程死鎖的四個條件
程序和線程的差別
持久化
事務的特征
中途還讨論了Masonry的限制應該寫在哪裡,我說應該寫在layoutSubViews,他說會調用多次,然後争論了一會兒
總結起來:面試官喜歡抛出一個大點,看你能講多廣多深
阿裡二面 :40mins
介紹項目
性能優化
YYModel和AF源碼
如何自己設計json轉model
架構
迷之算法題
總結:阿裡的面試效率是真的不提了,二面和一面間隔時間可能相差了一個月吧,我已經從北京回到了學校開始上課了,而且這次面試感覺有點奇怪,最後那道迷之算法題我們也有讨論,實在沒搞懂計算兩點間的距離的算法還能怎樣優化,面試結束後我問了面試官最優解是怎樣的,面試官告訴我沒有最優,隻有更優(微笑臉)
作為一個開發者,有一個學習的氛圍跟一個交流圈子特别重要,這是iOS交流群:1001906160 進群密碼000,不管你是小白還是大牛歡迎入駐 ,分享BAT,阿裡面試題、面試經驗,讨論技術, 大家一起交流學習成長!
阿裡三面:2h
一個安卓的面試官。。。。。
主要問了項目的一些東西 和給一些場景問我如何實作
自我介紹 介紹一些項目難點
主線程是相對于什麼而言的
一張圖檔的記憶體占用大小是由什麼決定的
索引的作用
索引的優缺點
在數組中找最小的k個數
淘寶下拉加載更多如何優化
淘寶頁面發送HTTP請求的過程
介紹一下MVVM
知道哪些設計模式
總結:三面面試官主要就聊了一些具體場景問題和一些基礎,基礎我覺得沒太大問題。面試過程中我講到一些東西發現面試官聽不懂,才知道面試官是做安卓的,問一些問題其實有點讓我無語,但是總的來說還是回答過來了,感覺也沒有太大問題,但是後面還是被挂了,很無奈。
分享下,百度、美團的面試總結吧!
runtime相關問題
runtime是iOS開發最核心的知識了,如果下面的問題都解決了,那麼對runtime的了解已經很深了。runtime已經開源了,這有一份别人調試好可運作的源碼objc-runtime,也可以去官網找objc4
結構模型
- 介紹下runtime的記憶體模型(isa、對象、類、metaclass、結構體的存儲資訊等)
- 為什麼要設計metaclass
-
&class_copyIvarList
差別class_copyPropertyList
-
和class_rw_t
的差別class_ro_t
-
如何被加載的,兩個category的category
方法的加載順序,兩個category的同名方法的加載順序load
-
&category
差別,能給NSObject添加Extension嗎,結果如何extension
- 消息轉發機制,消息轉發機制和其他語言的消息機制優劣對比
- 在方法調用的時候,
之前做了什麼方法查詢-> 動态解析-> 消息轉發
-
、IMP
、SEL
的差別和使用場景Method
-
、load
方法的差別什麼?在繼承關系中他們有什麼差別initialize
- 說說消息轉發機制的優劣
記憶體管理
-
的實作原理?weak
的結構是什麼樣的SideTable
- 關聯對象的應用?系統如何實作關聯對象的
- 關聯對象的如何進行記憶體管理的?關聯對象如何實作weak屬性
-
的原理?所使用的的資料結構是什麼Autoreleasepool
-
的實作原理?ARC
下對ARC
做了哪些優化retain & release
-
下哪些情況會造成記憶體洩漏ARC
Runloop & KVO
runloop
runloop
對于一個标準的iOS開發來說都不陌生,應該說熟悉
runloop
是标配,下面就随便列幾個典型問題吧
- app如何接收到觸摸事件的
- 為什麼隻有主線程的
是開啟的runloop
- 為什麼隻在主線程重新整理UI
-
和PerformSelector
的關系runloop
- 如何使線程保活
KVO
同
runloop
一樣,這也是标配的知識點了,同樣列出幾個典型問題
- 實作原理
- 如何手動關閉kvo
- 通過KVC修改屬性會觸發KVO麼
- 哪些情況下使用kvo會崩潰,怎麼防護崩潰
- kvo的優缺點
Block
-
的内部實作,結構體是什麼樣的block
- block是類嗎,有哪些類型
- 一個
變量被int
修飾與否的差別?block的變量截獲__block
-
在修改block
,需不需要添加NSMutableArray
__block
- 怎麼進行記憶體管理的
-
可以用block
修飾嗎strong
- 解決循環引用時為什麼要用
修飾__strong、__weak
-
發生block
時機copy
-
通路對象類型的Block
時,在auto變量
下有什麼差別ARC和MRC
多線程
主要以GCD為主
-
開發中有多少類型的線程?分别對比iOS
-
有哪些隊列,預設提供哪些隊列GCD
-
有哪些方法apiGCD
-
主線程 & 主隊列的關系GCD
- 如何實作同步,有多少方式就說多少
-
實作原理dispatch_once
- 什麼情況下會死鎖
- 有哪些類型的線程鎖,分别介紹下作用和使用場景
-
中的NSOperationQueue
預設值maxConcurrentOperationCount
-
的優劣NSTimer、CADisplayLink、dispatch_source_t
性能優化
- 如何做啟動優化,如何監控
- 如何做卡頓優化,如何監控
- 如何做耗電優化,如何監控
- 如何做網絡優化,如何監控
架構設計
- AFN
- SDWebImage
- JSPatch、Aspects(雖然一個不可用、另一個不維護,但是這兩個庫都很精煉巧妙,很适合學習)
- Weex/RN, 筆者認為這種前端和用戶端緊密聯系的庫是必須要知道其原理的
- CTMediator、其他router庫,這些都是常見的路由庫,開發中基本上都會用到
- 請
們在評論下面補充吧圈友
架構設計
- 手動埋點、自動化埋點、可視化埋點
-
設計模式MVC、MVP、MVVM
- 常見的設計模式
- 單例的弊端
- 常見的路由方案,以及優缺點對比
- 如果保證項目的穩定性
- 設計一個圖檔緩存架構(LRU)
- 如何設計一個
git diff
- 設計一個線程池?畫出你的架構圖
- 你的app架構是什麼,有什麼優缺點、為什麼這麼做、怎麼改進
資料結構與算法
對于移動開發者來說,一般不會遇到非常難的算法,大多以資料結構為主,筆者列出一些必會的算法,當然有時間了可以去LeetCode上刷刷題
- 八大排序算法
- 棧&隊列
- 字元串處理
- 連結清單
- 二叉樹相關操作
- 深搜廣搜
- 基本的動态規劃題、貪心算法、二分查找
總結
這些都是作者收集的加上自身面試的一些經驗總結,後期會持續收集補充,歡迎圈内的高手在評論區或者公衆号貼上你的答案或者高品質問題
準備面試是一方面,對于非面試的iOS開發者來說更适用于檢驗自己,發起進階之路。另外知識點是瑣碎的,但是真的能全部弄懂并把瑣碎的知識點融會貫通,建構起自己的知識體系,你就更新了。
作為一個開發者,有一個學習的氛圍跟一個交流圈子特别重要,這是一個我的iOS交流群:1001906160 進群密碼000,不管你是小白還是大牛歡迎入駐 ,分享面試題、面試經驗,讨論技術, 大家一起交流學習成長!