天天看點

美團 ,百度 ,阿裡, 面試收獲(經驗分享)

前言

年前沒有太多時間學習,面試百度、美團到三面就被刷下來了!

疫情期間啃完了這份美團大佬整理的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

結構模型

  1. 介紹下runtime的記憶體模型(isa、對象、類、metaclass、結構體的存儲資訊等)
  2. 為什麼要設計metaclass
  3. class_copyIvarList

    &

    class_copyPropertyList

    差別
  4. class_rw_t

    class_ro_t

    的差別
  5. category

    如何被加載的,兩個category的

    load

    方法的加載順序,兩個category的同名方法的加載順序
  6. category

    &

    extension

    差別,能給NSObject添加Extension嗎,結果如何
  7. 消息轉發機制,消息轉發機制和其他語言的消息機制優劣對比
  8. 在方法調用的時候,

    方法查詢-> 動态解析-> 消息轉發

    之前做了什麼
  9. IMP

    SEL

    Method

    的差別和使用場景
  10. load

    initialize

    方法的差別什麼?在繼承關系中他們有什麼差別
  11. 說說消息轉發機制的優劣

記憶體管理

  1. weak

    的實作原理?

    SideTable

    的結構是什麼樣的
  2. 關聯對象的應用?系統如何實作關聯對象的
  3. 關聯對象的如何進行記憶體管理的?關聯對象如何實作weak屬性
  4. Autoreleasepool

    的原理?所使用的的資料結構是什麼
  5. ARC

    的實作原理?

    ARC

    下對

    retain & release

    做了哪些優化
  6. ARC

    下哪些情況會造成記憶體洩漏

Runloop & KVO

runloop

runloop

對于一個标準的iOS開發來說都不陌生,應該說熟悉

runloop

是标配,下面就随便列幾個典型問題吧

  1. app如何接收到觸摸事件的
  2. 為什麼隻有主線程的

    runloop

    是開啟的
  3. 為什麼隻在主線程重新整理UI
  4. PerformSelector

    runloop

    的關系
  5. 如何使線程保活

KVO

runloop

一樣,這也是标配的知識點了,同樣列出幾個典型問題

  1. 實作原理
  2. 如何手動關閉kvo
  3. 通過KVC修改屬性會觸發KVO麼
  4. 哪些情況下使用kvo會崩潰,怎麼防護崩潰
  5. kvo的優缺點

Block

  1. block

    的内部實作,結構體是什麼樣的
  2. block是類嗎,有哪些類型
  3. 一個

    int

    變量被

    __block

    修飾與否的差別?block的變量截獲
  4. block

    在修改

    NSMutableArray

    ,需不需要添加

    __block

  5. 怎麼進行記憶體管理的
  6. block

    可以用

    strong

    修飾嗎
  7. 解決循環引用時為什麼要用

    __strong、__weak

    修飾
  8. block

    發生

    copy

    時機
  9. Block

    通路對象類型的

    auto變量

    時,在

    ARC和MRC

    下有什麼差別

多線程

主要以GCD為主

  1. iOS

    開發中有多少類型的線程?分别對比
  2. GCD

    有哪些隊列,預設提供哪些隊列
  3. GCD

    有哪些方法api
  4. GCD

    主線程 & 主隊列的關系
  5. 如何實作同步,有多少方式就說多少
  6. dispatch_once

    實作原理
  7. 什麼情況下會死鎖
  8. 有哪些類型的線程鎖,分别介紹下作用和使用場景
  9. NSOperationQueue

    中的

    maxConcurrentOperationCount

    預設值
  10. NSTimer、CADisplayLink、dispatch_source_t

    的優劣

性能優化

  1. 如何做啟動優化,如何監控
  2. 如何做卡頓優化,如何監控
  3. 如何做耗電優化,如何監控
  4. 如何做網絡優化,如何監控

架構設計

  1. AFN
  2. SDWebImage
  3. JSPatch、Aspects(雖然一個不可用、另一個不維護,但是這兩個庫都很精煉巧妙,很适合學習)
  4. Weex/RN, 筆者認為這種前端和用戶端緊密聯系的庫是必須要知道其原理的
  5. CTMediator、其他router庫,這些都是常見的路由庫,開發中基本上都會用到
  6. 圈友

    們在評論下面補充吧

架構設計

  1. 手動埋點、自動化埋點、可視化埋點
  2. MVC、MVP、MVVM

    設計模式
  3. 常見的設計模式
  4. 單例的弊端
  5. 常見的路由方案,以及優缺點對比
  6. 如果保證項目的穩定性
  7. 設計一個圖檔緩存架構(LRU)
  8. 如何設計一個

    git diff

  9. 設計一個線程池?畫出你的架構圖
  10. 你的app架構是什麼,有什麼優缺點、為什麼這麼做、怎麼改進

資料結構與算法

對于移動開發者來說,一般不會遇到非常難的算法,大多以資料結構為主,筆者列出一些必會的算法,當然有時間了可以去LeetCode上刷刷題

  1. 八大排序算法
  2. 棧&隊列
  3. 字元串處理
  4. 連結清單
  5. 二叉樹相關操作
  6. 深搜廣搜
  7. 基本的動态規劃題、貪心算法、二分查找

總結

這些都是作者收集的加上自身面試的一些經驗總結,後期會持續收集補充,歡迎圈内的高手在評論區或者公衆号貼上你的答案或者高品質問題

準備面試是一方面,對于非面試的iOS開發者來說更适用于檢驗自己,發起進階之路。另外知識點是瑣碎的,但是真的能全部弄懂并把瑣碎的知識點融會貫通,建構起自己的知識體系,你就更新了。

作為一個開發者,有一個學習的氛圍跟一個交流圈子特别重要,這是一個我的iOS交流群:1001906160 進群密碼000,不管你是小白還是大牛歡迎入駐 ,分享面試題、面試經驗,讨論技術, 大家一起交流學習成長!

繼續閱讀