面試
我面試了大大小小的各類公司,BAT、bigo、字節、快手、伴魚等,由於一些緣由,也拒面了一些公司,拿了幾家的offer。前端
伴魚
伴魚是我準備後參加的第一輪面試,有不少本身準備得不是很全,也沒有徹底進入面試狀態,面試結果不是很好,一面就掛了。web
看到本文章若是你正在跳槽或者正準備跳槽不妨動動小手,添加一下我們的交流羣563513413來獲取一份詳細的大廠面試資料爲你的跳槽多添一份保障。面試
一面
- 算法題:判斷平衡二叉樹(easy)
- 代碼閱讀題:(問輸出)
TestObject *object1 = [[TestObject alloc] init];算法
__block TestObject *object2 = [[TestObject alloc] init];swift
object1.name = @"Mike";後端
object2.name = @"Sean";數組
__block int vi = 1;緩存
void (^handler)(NSString ) = ^(NSString name) {安全
object1.name = name;性能優化
object2.name = name;
vi = 2;
}
handler(@"Lucy");
NSLog(object1.name);
NSLog(object2.name);
NSLog(@"%i", vi);
引伸:
- 若是__block int vi = 1; 這句改爲int vi = 1會怎樣,爲何
- 代碼中的block是什麼block,爲何
- weak的實現原理
- weak弱引用表是可變的麼仍是不可變的
- weak是在何時置nil的,若是同時有不少對象對性能影響大怎麼辦
- UIView 和 CALayer的關係和區別
- UIView 和 CALayer在動畫上的區別
- frame和bounds在什麼狀況下是不相等的
- bounds x,y 必定是0,0麼,爲何
- bounds 改爲 (50, 50, width, height)會發生什麼,view自己,子View?
58
58我面了不少次,一開始面的基礎研發部門,後來給我轉到了企業工具研發,中間時間拖得有點長,直接拒面了。
一面
- 說下你在開發過程當中遇到過的內存泄漏
- NSTimer 怎麼處理內存泄漏
- Delegate什麼狀況下會出現內存泄漏,怎麼解決
- Delegate和Notification的區別
- 多線程相關
- iOS中有哪些多線程技術
- 若是有兩個同步任務嵌套會怎樣
- 常見的鎖,爲何要加鎖
- C依賴AB任務執行完才能執行,你怎麼設計
- 讀寫鎖底層怎麼實現
- JavaScriptCore相關
- 什麼是JavaScriptCore,JS和Native是怎麼進行通訊的
- 你知道hybrid麼,說說你日常怎麼使用的(由於沒怎麼接觸過直接說的不會)
- 後面就是聊天了,中間穿插問了下動態庫和靜態庫的卻別
二面(終面)
58這個部門的面試就兩輪,二面是羣面(幾我的輪流面你),第一次接觸這種面試形式,壓力仍是有點的。
- 對個人項目表感興趣,前面聊了很多項目的內容,問了下項目的背景,作了啥以及有哪些收益
- 瞭解業內性能優化是怎麼作的麼
- 你項目中是怎麼作性能優化的
- ReactNative相關
- RN的原理
- RN和flutter的區別
- 你知道RN拆包麼,RN爲何要拆包
- JS是單線程的是怎麼和native多線程進行交互的(這個問題有點奇葩)
- JS和native通訊的數據結構是什麼
- 大家公司對於線上JSError作了哪些事情是怎麼處理的
- 你有什麼想問的麼
一個創業公司
這個創業公司全程都是在聊天,後面問了些和iOS沒多大關係的問題,而後就發了口頭offer。
- 聊天:在公司中學到了啥,爲啥要來北京等
- 有一個10個G的文件裏面每一行都有數字,對這些數字進行排序(兩種方法)
- 怎麼將彩色的圖片專程黑白的
- Web渲染和Native渲染有什麼異同點
拼多多
拼多多應該是本身面的一個相對較大的公司,面試過程當中和麪試官有了點小分歧,後面問我源碼在哪一個文件哪一行,後面問得問題也基本上是我以前沒怎麼接觸過的。
一面
- 算法: 手寫LFU(用字典寫了二十多分鐘,面試官讓優化只知道能夠用雙鏈表優化,可是集體沒能寫出來)
- 一個操做若是耗時5s後返回nil,不然返回一個字符串,你怎麼設計(要求手寫代碼)
- GCD中常見的操做(要求寫代碼)
- Struct中有一些成員變量佔多少字節
- 一個OC對象在iOS中所佔內存的字節數(這邊和麪試官爭了下,我說是iOS中至少16個字節,由於內存對齊,面試官問你肯定我說我肯定,而後就有了後面的問題)
- 你看過alloc的源碼麼,你剛剛說的代碼是在哪一個文件哪一行
- dealloc的整個過程
- NSURLSession相關的內容(具體忘了)
- web和native怎麼共享cookie
- xx(前司)有動態庫打包麼,你看過xx ipa(前司app)的結構麼
- 內聯函數和普通函數的區別
- 怎麼hook一個C函數
- 有什麼想問的麼
百度
百度問得和iOS相關的較少,CS基礎相對較多。
一面
- 聊項目:主要問了項目的技術棧選擇,以及項目中有哪些難點
- http header 和 body
- GET和POST請求
- GET請求參數必定是放在URL中的麼
- HTTPS (TLS是啥,怎麼創建鏈接等)
- 動態庫和靜態庫的區別
- +load 和 initialized方法的區別
- +load的調用時機
- +load分類中的處理
- 分類的實現機制
- 分類和類別的區別
- 分類中添加屬性
- 關聯對象的原理
- 算法:有一個很大的整形數據,轉成二進制求1的個數(由於前面聊比較多,只要求說了下思路)
二面
- 聊項目:本身項目偏後端,問了不少和後端相關的內容,後續問的問題也基本上要求從客戶端和後端雙重角度回答
- 你瞭解的網絡協議
- HTTP和TCP、UDP的聯繫
- HTTP和HTTPS的區別
- HTTPS的原理
- 在HTTPS創建鏈接的時候都用了哪些加密算法,爲何要這麼設計
- 常見的加密算法
- 對稱加密算法和非對稱加密算法的區別
- 說說點擊一個按鈕後打開一個web頁面從發送網絡請求到頁面展現都作了啥
- 爲何能經過一個URL就能請求到對應的資源(域名解析等)
- 若是客戶端上有個按鈕,點擊會觸發一次網絡請求,在短期內快速點擊,怎麼處理(從客戶端以及服務端角度思考)
- 知道什麼是HTTPDNS麼
- GET請求和POST的區別,POST請求參數能放在URL中麼爲啥
- 你瞭解的HTTP請求響應狀態碼
- 說說爲何要設計304這個狀態碼
- Web登陸時怎麼保持會話狀態的
- 你知道cookie和session的區別麼
- 你知道常見的網絡攻擊麼
- 什麼是中間人攻擊原理,怎麼預防
- 日常用過抓包工具麼,說說抓包的原理
- 若是讓你設計一個HTTPS抓包你回怎麼設計
- 進程和線程的區別是啥
- 進程的通訊機制
- 進程A和進程B經過管道通訊的話是在同一個管道麼
- 多線程容易出現的問題,怎麼解決
- 死鎖產生的條件以及對應的解決方案
- 自旋鎖和互斥鎖的卻別
- 什麼是虛擬內存,虛擬內存和物理內存的關係和區別
- 行間的換頁算法有哪些
- LRU、LFU
- 繼續問項目,爲啥要作這些東西,碰到了什麼難點
- 你以爲你的優點和缺點是啥
- 本身的將來規劃
- 還有什麼想問的麼
三面
- 百度三面中主要問的和職業規劃相關的內容,沒有太多的參考價值,這邊再也不敘述
騰訊
由於一開始是在音樂的流程裏,約面時間相對較晚,pcg那邊想和我先聊下,而後再作選擇,因而騰訊面了騰訊音樂和PCG兩個部門
PCG
pcg在音樂以前面,面完一面後說一面過了,可是由於流程在音樂,因此讓我選擇一個流程走,我選了音樂,後來音樂掛了後沒有好意思去舔回來。
一面
- 聊項目
- category的實現原理
- weak的實現原理
- 開發中遇到的crash
- 怎麼處理這些crash的,有什麼好的解決方案麼
- 循環引用問題,怎麼解決
- NSTimer相關,和runLoop的關係
- NSTimer、CADisplayLink以及GCD Timer的對比
- 算法:求N!
騰訊音樂
騰訊音樂感受業務不是不少口,感受面試官不知道問我什麼好,一面後就沒有後續了。
一面
- 前面聊項目:背景收益等
- 想看機會的緣由
- RN是這麼作到和native通訊的
- 若是讓你實現RN的效果你會怎麼設計(這個問題看你功底了)
- Native是怎麼將方法暴露出去的
- 需求中的難點,你是怎麼解決的
- A調用了B方法都作了什麼事情
- ISA指針
- 64位後怎麼獲取ISA指針
- runloop、runtime工做中有接觸過嘛
- 手指觸摸屏幕後系統都作了哪些事情
- 怎麼監聽頁面的卡頓
- 怎麼監聽函數執行時間
- 還有什麼想問的麼
微博
微博有點迷,感受面試官就是對着題庫問問題,感受本身回答還OK,可是一面後不了了之了。
一面
- 基本上都是一些iOS的基礎,和本文面經提到的高度重複,再也不敘述。
Bigo
Bigo整個流程推動很快,一面二面都在當天完成,可是bigo三面後掛了,有點迷,我猜想是由於二面的算法題沒有給出最優解。
一面
- 算法(三道手寫)
- 字符串轉整形
- 反轉鏈表(遞歸和非遞歸)
- 將兩個有序鏈表合併成一個有序鏈表
- iOS基礎:
- Objective-C的內存管理
- ARC和MRC的區別
- Timer的使用,怎麼避免循環引用
- autoreleasePool的底層實現機制
- autoreleasePool的底層數據結構,爲何要這麼設計
- iOS中常見的多線程技術
- 常見的鎖,有什麼區別
- 若是讓你設計讀寫鎖,你怎麼設計
- RN、flutter、weex:
- 你怎麼看待這些動態化技術
- RN、flutter以及weex的區別
- RN怎麼和native通訊的
- 後面簡單聊了下將來的規劃
二面
- 算法: 山脈數組找目標值(要求logN的時間複雜度)
- QA發現了一個按鈕沒法響應點擊事件,多是什麼緣由致使的(說了五種狀況好像沒有答到面試官要的點)
- iOS響應者鏈,怎麼尋找最合適的響應者,若是爲nil會怎麼辦
- frame和bounds的區別
- 若是bounds的origin不是00會怎樣
- 你日常用過Charles麼,說說Charles的抓包原理
- Charles能抓HTTPS麼,怎麼實現
- HTTPS怎麼創建鏈接的
- 中間人攻擊,怎麼避免
- 多線程通常會有什麼問題,請舉個例子
- 爲何會形成上述問題以及解決方案
- 主隊列和主線程的關係
- 全局併發隊列必定在主線程上運行的麼
- 項目相關,用了什麼技術,有哪些難點,怎麼處理的
三面
- 自我介紹
- 爲啥想看機會
- 聊了下項目
- 怎麼看待RN、Flutter
- 日常有看過什麼技術書籍嗎
- 有看過開源框架嗎
- 工做中遇到最難的事情後面是怎麼解決的
- 有什麼想問的麼
看完文章若是你正在跳槽或者正準備跳槽不妨動動小手,添加一下我們的交流羣1012951431來獲取一份詳細的大廠面試資料爲你的跳槽多添一份保障。
貝殼找房
貝殼找房也感受有點迷,和麪試官感受聊很不錯,問得問題都很開放,很考驗功底,最後還問我你感受你過了麼。可是一面後就沒有而後了。
一面
- 自我介紹
- 聊項目
- GCD 看你能說些啥
- Runtime看你能說些啥
- 內存管理看你能說些啥
- 幾個簡單的鏈表問題(具體忘了)
- 有什麼想問的,以及根據簡歷給個人一些建議(簡歷偏向全棧,意思是我工做時間還不是很長,須要有深度,廣度相關的能夠後續再考慮)
完美世界
完美的面試有點匆忙,面試的問題也頗有深度,後續由於必需要去現場面試,出於安全因素考慮,沒有去面下去。
一面
- 自我介紹
- 項目中遇到的問題,怎麼解決的
- 聊了聊OC中的內存管理
- 一個對象何時會引用計數+1,何時引用計數-1
- 對象A copy後生成字符串對象B AB引用計數是怎樣的
- 若是A是可變的呢
- 關鍵字,readonly有了解嗎
- 修飾對象的默認關鍵字是啥
- category相關,category是怎麼實現的
- category的結構
- category中的方法會覆蓋原來類的方法嗎
- category中怎麼區分開類方法和實例方法的
- category的方法是怎麼插入到類(元類)對象方法列表中的
- 同時最多執行5個任務怎麼設計
- AFN中 success 和 fail block是在子線程仍是主線程
- 不經過回到主隊列的方式回到主線程(有點沒get到點)
- SDWebImage的下載原理
- 若是有兩個相同的url,SDWebImage是怎麼處理的
- 算法:有個view有不少子view,沒個子view中也有不少子view,找出全部的按鈕,並切圓角(圖的BFS)
滴滴
滴滴效率是真的高,面試流程一夜走完,當晚出結果,從面試到發offer僅僅用了4天左右的時間。
一面to終面
- 主要涉及iOS(runtime、runloop、內存管理等)
- 計算機網絡(HTTP、HTTPS、TCP/UDP等)
- 操做系統(進程線程、進程通訊、中斷的一些機制以及一些換頁算法等)
- 算法基礎(常見的一些鏈表、樹以及數組算法題)
ps:面試題以前均有涉及,再也不詳寫
猿輔導
猿輔導面試仍是有點難度的,算法寫完還要跑case,第二道題目跑case不正確,看代碼debug,後面由於時間不夠沒有給出正確結果,後面就沒有後續了。
一面
- 聊項目(主要是項目中的一些技術點)
- 聊對大前端的見解(weex、RN、Flutter對比等)
- JS是怎麼實現繼承的,什麼是JS的原型鏈
- iOS內存管理(引用計數、修飾詞、weak和assign的區別)
- runtime(什麼是runtime,爲啥要有runtime,你用runtime作過什麼事情)
- 怎麼進行方法的交換
- +load在何時調用的,對啓動的影響
- 代碼題:ABCDE五個任務,D依賴AB的執行,E依賴BC的執行,怎麼設計
- GCD信號量,線程同步等
- Runloop是啥,爲啥要設計runloop,runloop和線程的關係
- Timmer爲啥會有內存泄漏的現象,Runloop會持有Timmer麼
- 什麼是source0和source1,分別作什麼事情
- 怎麼監測app卡頓
- UIView 和 CALayer的區別,爲何要這麼設計
- 隱式動畫和顯示動畫的區別
- 算法:兩題LC medium(都要求寫完跑case)
- 給定一個數字n 求出所有集合(n = 3 輸出 [[],[1],[2],[3],[1,2],[1,3],[2,3],[1,2,3]])
- Lc 200 求島嶼個數
高德
這邊有個小插曲,由於以前高強度的面試,後面拿了幾個不錯的offer後就不太想繼續面了,感受面試狀態也是一個正態分佈的曲線,拒了高德面試後hr找我聊了下,而後又答應繼續面試,後面由於本身確實沒有發揮出正常的水平,致使一面掛了,不過hr後來請我喝了杯咖啡仍是蠻開心的。
一面
- 聊項目
- JS是怎麼和Native通訊的
- 模塊表是怎麼生成的
- JS函數注入怎麼作的
- RN 和 Weex 的區別
- HTTP 請求頭
- HTTP 狀態碼
- 分類和extension區別
- 分類的實現機制
- 分類同名方法的調用
- 關聯對象,策略有哪些,關聯對象的key爲啥要用static修飾(這個沒有get到點)
- GCD、NSThread以及NSOperation的區別,怎麼取消任務
- GCD block內存管理
- 本身實現一個函數,其中有個形參是block,這個block是何時進行copy的,必定會進行copy操做嘛
- 手指點在高德地圖上的一個按鈕,會發生什麼 ,具體說明
- 怎麼找到最合適的view
- 如過有多個子VC,是先VC仍是先View
- Runloop是怎麼監聽到點擊事件的
- Runloop和線程的關係,Runloop能單獨存在嘛
- 怎麼作到線程保活
- A包含B包含C,怎麼作才能讓C的點擊響應區域是 以C對角線爲半徑的圓弧(要說出具體實現方式)
- 代碼題:
- 下方代碼中三個數組中的p.name是啥,爲何
Person *p = [[Person alloc] init];
p.name = @"zhangsan";
NSArray *a = @[p];
NSArray *b = [a copy];
NSArray *c = [a mutableCopy];
Person *p2 = [c firstObject];
p2.name = @"lisi";
NSNotificationCenter *__weak center = [NSNotificationCenter defaultCenter];
id __block token = [center addObserver:kDdiRegisterNotification
object:nil
queue:[NSOperationQueue mainQueue]
usingBlock:^(NSNotification *note) {
[self getDataWithComplete:completeBlock];
[center removeObserver:token];
}];
字節跳動
字節面了兩個部門,一個是頭條還有一個是抖音,字節是在我回去動了個小手術後面的,面試也不是很在狀態。
頭條
一面(交叉面)
- 首先是一組代碼,問有啥代碼風格不妥的地方(代碼忘記了)
- MRC 和 ARC 的區別
- ARC有什麼缺點
- MRC 下 寫setter方法
- 代碼題:(一、輸出什麼 二、若是是在自線程中會怎麼樣)
NSLog(@"1");
dispatch_sync(^{
NSLog(@"2");
});
NSLog(@"3");
- 你理解的id 以及 id 和 void *區別
- 函數指針和指針函數的區別
- CALayer 和 UIView的關係
- 蘋果爲何要這麼設計
- frame、bounds、center
- layoutIfNeeded、layoutSubViews、setNeedsDisplay區別
- 響應者鏈(順便說了下完整的手指觸摸屏幕會發生什麼引出了後續runloop相關問題)
- runloop source0 和 source1都是啥
- runloop和線程的關係
- OC 消息發送機制(提到了isa、類對象,引出下面問題)
- 寫下類的結構
- isa在32爲和64位的區別
- 什麼是元類爲啥要這麼設計
- category 和 extension 的區別
- +load方法
- 算法題 判斷鏡像二叉樹
二面
- 自我介紹
- 聊項目
- Weex和RN以及flutter的區別
- 要是收到了內存警告怎麼辦
- 循環引用和內存泄露
- Block形成循環引用的原理
- Runloop和Timer的關係
- Runloop能有不少Timer麼
- 什麼是source0 和 source1
- Timer必定是準時的嗎,爲何
- FPS怎麼監控,上傳時機
- 算法:兩數之和(要求空間複雜度O(1))
抖音
抖音面試有點迷,感受面試官和我徹底在兩個頻道,面試官問的內容我明明回答了可是他恕我啥都不會,不知道是否是沒有get到他的點。
一面
- 聊項目
- iOS中+load 和 initialized區別
- iOS修飾屬性經常使用的修飾符
- weak和strong的區別
- strong和unsafe_unretained區別
- 什麼是單例
- 對象的比較
- 算法:開根號(要求跑case)
快手
快手也是在我動完小手術後面的,我感受面試發揮正常,和麪試官聊也不錯,可是玄學的是本身仍是掛了,後面有其餘BG想撈也不想面了。
一面
- 自我介紹
- 在學校都作了哪些項目
- 聊公司項目
- 常見的crash
- 怎麼處理這些crash
- 怎麼設計一個crash日誌回撈系統
- Objc爲啥要設計消息發送機制,直接調函數很差嗎
- 怎麼獲取函數的堆棧
- 怎麼監控APP卡頓
- APP啓動作了哪些事情怎麼優化
- +load
- 怎麼進行業務解耦
- APP性能優化相關
- 設計一個下載任務
- 能夠並行也能夠串行
- 有最大的併發數量
- 能夠斷點續傳
- 如何解耦
- 緩存怎麼設計(說了LRU、LFU)
- 微信底部四個tab 包含首頁讓你實現要多久,爲何(這個真的沒有明白是想問啥)
- 算法:鏈表反轉
總結
一天四輪的面試確實是高強度的,一天下來整我的會很疲憊,致使前面拿到了一些offer後,緊繃的弦立刻就鬆懈下來了,後面幾輪高德、字節以及快手的面試都沒有發揮出本身應有的水平,所幸的是總體結果差強人意。面試須要不斷覆盤總結,不至於此次面試問的問題不懂下次還不懂,還有知識須要不斷積累,不能再臨時抱佛腳了。
簡歷
簡歷決定着你可否有面試機會,一份好的簡歷可讓你事半功倍。
- 能夠去網上找一份簡歷模板
- 簡歷儘可能精簡,最好能控制在一頁A4紙
- 要作一些取捨,校園經歷儘可能不要寫了
- 描述項目建議用STAR法則(說清楚項目背景、目標、作了哪些事情取得了哪些成果)
- 本身不是很熟的東西就不要寫了,感受只要寫到簡歷上面試官就默認你精通
iOS相關
iOS有不少東西咱們是看不到具體的實現的,畢竟是閉源的,可是咱們能結合咱們的一些經驗去猜想蘋果的一些實現方式。目前iOS面試問的問題愈來愈細,愈來愈底層,因此閱讀一些源碼是及其有必要的,iOS通常常考的點以下(這邊列舉得可能並非很全):
- Objective-C語言相關
- OC的內存管理(ARC、MRC、autoReleasePool等)
- OC類的結構,class_ro_t、class_rw_t等
- OC的消息機制
- KVC、KVO
- OC的運行時,能作哪些事情
- OC的一些特性(weak的實現機制等)
- 分類和類別
- isa指針
- super與superClass
- dealloc
- KVC以及KVO
- block(類型、變量捕獲等)
- 循環引用問題
- swift相關:
- 筆者沒怎麼接觸過swift這邊就不寫了
- iOS相關
- UIView和CALayer的區別
- CoreAnimation
- 多線程(GCD、NSOperationQueue)
- runLoop以及runLoop的實現原理
- 響應者鏈
- Timer(NSTimer、CADisplayLink以及GCD Timer)
- iOS渲染的知識
動態化技術(加分項)
- 怎麼看待這些技術
- 須要瞭解下ReactNative、Flutter以及Weex等主流動態化技術的優缺點
- 根據實際狀況瞭解下ReactNative或Flutter等動態化技術的實現原理
- 瞭解下JavaScriptCore,知道和native的通訊機制
CS基礎
這部分主要看你基礎是否是紮實了,做爲一名RD,無論作什麼,這些知識都是要掌握的。
操做系統
- 進程和線程
- 進程通訊
- 虛擬內存和物理內存
- 常見的調度、換頁算法
- 中斷機制等
計算機網絡
- OSI七層模型
- 常見的協議(HTTP、HTTPS、TCP、UDP)
- HTTP報文格式
- GET、POST卻別
- HTTP狀態碼
- HTTP和HTTPS的區別
- HTTPS的鏈接創建機制
- TCP三次握手以及四次揮手,爲何要三次握手,四次揮手少一次會怎樣
- TCP和UDP區別
- TCP的一些安全機制(用塞控制,較驗和等)
- 域名解析等
編譯原理
算法(脫離編譯器手寫,最好能肉眼debug)
算法基本上是工程師面試一定考察的點,如今愈來愈多的公司面試考察算法,做爲iOS開發的同窗,在面試以前至少要刷下《劍指offer》上的全部題目,這本書上的題目都是經典中的經典,面試出現機率極高。有時間的話能夠刷下LeetCode上easy和medium難度的題,iOS面試,不多有考察hard的題目,可是就算是遇到hard的題目也不要過於緊張,仔細審題,尋找突破口。算法是一個積累的過程,如今LeetCode能夠每日打卡,這是一個很好的積累手段。下面羅列下常考的數據結構和算法:
- 數據結構
- 數組
- 鏈表
- 樹
- 算法
- 二分(就本人經驗來看出現機率極高)
- 分治
- 排序(8大排序)
- 樹的遍歷(前、中,後)
- BFS以及DFS
- DP(出現機率較低)