地處北方一隅,今年很多公司春招沒來現場,所以基本都是提前批的線上面試,整個三月都過的比較累,4月份的校招應該不參加了,還是噹噹鹹魚了,然後去實習了。
雖然之前一直比較抗拒背書和刷題,但是經歷之後發現自己的基礎是真的差,打好基礎真的很有必要。
參加面試的公司(線上提前批+線下校招):時間順序:3.1~4.10
1,今日頭條:(三面掛)
2,作業幫(線下校招),offer get
3,瓜子網(線下校招),offer get
4,北京網易公開課,offer get
5,上海流利說,offer get
6,微信廣州,offer get
7,阿里巴巴杭州(技術評級A),offer get
8,上海美團,offer get
。。。。。
1 問到的問題總結:
不能直接po原題,但是我總結了下背後的知識點:以下的知識點都最好挖的深一點,我這裡只是點一下,但是每個點都可以挖很深,儘量都和runtime&runloop&效能優化穿起來說,結合自己遇到的坑說下)
- 非同步繪製&離螢幕渲染&CPU渲染和GPU渲染(說白了就是一些效能優化,這塊比較看功底)
- UIView 生命週期,UIViewController的生命週期
- iOS中有哪些鎖(原理+應用+優化)
- 怎麼看待稽核被拒
- runloop中將一個任務放到第二次runloop中執行:利用socket/port做一些事情(封裝一個source)
- UIKit框架架構圖多看看
- id和instencetype的區別
- instrument的外掛的使用(儘量都用一下)
- IMP和SEL以及具體執行的操作
- 在專案什麼時候選擇使用GCD,什麼時候選擇NSOperation?(根據專案規模以及介面的策略決定以及執行緒操作複雜程度)
- 發現程式崩在一個objc_msgSend函式裡面,這時候可以看的到當前正在呼叫哪個物件的哪個selector嗎?(可以的,可以查到呼叫的堆疊資訊。還可以將這個堆疊資訊dump下來)
- NSString型別的property常用copy的原因
- 如何把非同步執行緒轉化成同步執行緒進行單元測試
- autoreleasepool的使用場景和原理:基於runloop回答,並且提及autoreleasepage的實現(基於雙向連結串列))
- 對於Objective-C,你認為它最大的優點和最大的不足是什麼?對於不足之處,現在有沒有可用的方法繞過這些不足來實現需求。
- app記憶體是怎麼分析的:Xcode有兩種方法(有區別:是否計入圖片快取)
- 記憶體的使用和優化的注意事項
- 怎樣使用performSelector傳入3個以上引數,其中一個為結構體。
- nsstring物件的retainCount問題:(細摳下)
- isMemberOfClass 和 isKindOfClass 聯絡與區別
- 實現準確的定時器:
- NSObject實現了哪些協議
- 訊息轉發的機制(基於runtime講全點)
- 使用runtime Associate方法關聯的物件,需要在主物件dealloc的時候釋放麼
- 能否向編譯後得到的類中增加例項變數?能否向執行時建立的類中新增例項變數
- 手勢相應和觸控事件傳播的優先順序以及處理等
1.2 計算機基礎(計網+資料結構+程式設計基礎+作業系統):
資料庫沒咋問就不po了。。。。
1.2.1計算機網路:
- NSURLConnection 相比,NSURLsession 改進:
- AFN用什麼方式實現多執行緒
- TCP是基於流式傳輸的,怎麼設計協議,進行協議的解析?
- 怎麼實現上傳/下載任務的斷點續傳
- 傳送網路請求,什麼時候連IP、什麼時候連域名
- socket程式設計有了解嗎?用在專案的哪裡?
- 客戶端程式設計的時候,客戶端send成功了,服務端沒收到,有什麼可能的原因
- 只用TCP,如何設計這個聊天協議?
- http和scoket通訊的區別。
- CFSocket使用有哪幾個步驟。Core Foundation中提供了哪幾種操作Socket的方法?
- HTTPS具體過程,7次握手,以及如何防止中間人攻擊的
- 常見的狀態碼(應用層次)
- URL重定向
- TCP、UDP的特點以及具體應用
- 滑動視窗的理解以及慢開始的措施
1.2.2 資料結構:
- 雜湊表的實現(摳的很細):當拉鍊長度超過閥值時,會有什麼優化(參照JDK的處理思想)
- 常見的連結串列演算法(參照《劍指 offer》)
- stack&queue演算法(參照《劍指 offer》)
1.2.3 程式設計基礎:
- 浮點型別為什麼不能精確
- 幾種容器的查詢、插入效率
- 可變容器的實現原理
- C++如何實現一個不能被繼承的class
- C的編譯過程
- 動態連結和靜態連結庫的區別
- C++和OC的區別
- GC和ARC的比較(GC是runtime的)
- 單例的實現(加鎖和效能優化)
- 記憶體的五大區域
- 程式碼檔案編譯生成過程完成的事情
1.2.4 作業系統
- 作業系統裡執行緒切換是怎麼實現的,怎麼把執行緒呼叫函式的引數拋到另一個執行緒
- 流水線的概念
- 虛擬儲存器的頁面置換演算法(程式設計實現)
- 死鎖的4個必要條件
- 程式間通訊的方式
- 緩衝區概念
- 死鎖的預防演算法
1.3 演算法基礎相關:
1.3.1圖:注意演算法的靈活運用
- 最小生成樹(prime演算法、kruskal演算法)
- 最短路徑演算法(floyd、dijkstra)
- 圖中是否存在環
- DFS&BFS的應用:迷宮問題比較多
- 拓撲排序
1.3.2 樹:基本都是2叉樹的演算法
這塊參照《劍指 offer》+自行百度常見的二叉樹演算法
1.3.3 排序演算法:
一定要深入理解三種排序的原理以及優化方法:比如大檔案排序演算法的優化,可利用快排和歸併的特點,利用兩種排序的特點,混合使用。
- 堆排序
- 快排:遞迴&非遞迴
- 歸併:遞迴&非遞迴
- 內排序和外排序
1.3.4 DP:問的比較多,但是種類有限
1.3.4.1 LCS類:
- 字串最長公共子序列
- 最長單調遞增子序列:先sort 然後轉化為LCS問題
1.3.4.2揹包問題:
- 0-1揹包問題:
- 陣列分為兩個sum和儘量相等的子陣列:揹包容量=sum/2,轉化為0-1揹包問題
- 多揹包問題:n個揹包,求最大和
- 完全揹包問題:
- 硬幣組合問題:
1.3.4.4所有組合數問題
- 1分2分5分的硬幣三種,組合成1角,共有多少種組合?
- 一個人上臺階可以一次上1個,2個,或者3個,問這個人上n層的臺階,總共有幾種走法
1.3.4.5最小路徑和問題:
- 矩陣的最小路徑和
- 三角形的最小路徑和
1.4程式設計思想&設計模式等:
- 程式設計思想參照《iOS程式設計之道》
- 設計模式主要是MVC&MVVM&MVCS的理解
- 元件化需要了解下
- 解耦的常用方法
- 設計模組的設計思路:
1,操作佇列如何封裝GCD,達到設定最大併發數(訊號量實現) 2,NSNumber的設計(類簇的設計思想) 3,寬窄介面的設計等
2 推薦書籍:
- 劍指offer(3編,對應牛客網的上的題全部刷完);
- 面試寶典(C++版)一遍
- 作業系統大概看一遍;
- 資料結構一遍,主要是hash那片,平時不太關注的到的地方,懂一些原理。
- 計算機網路【HTTP/HTTPS、tcp、udp、tcp/ip協議簇】大致是這些了
- 資料庫:
- leetcode刷題,easy全部刷完+部分中等題或者牛客網刷題均可
以下幾本書,多看幾遍,看一遍並不能很好的理解(可能是因為我比較菜):
- Objective-C高階程式設計(多執行緒與記憶體管理);
- Effective Objective-C 2.0;
- iOS程式設計之道
- 精通Objective-C
掘金技術徵文連結? juejin.im/post/5aaf2a…