一個渣碩iOS春招總結

地處北方一隅,今年很多公司春招沒來現場,所以基本都是提前批的線上面試,整個三月都過的比較累,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


推薦閱讀:

Tab Bar 應該要一直固定在界面下嗎?
荒野行動iOS版本怎麼玩?
山寨 Tweetbot 的界面設計的難度有多大?
提醒:4 月 22 蘋果 iTC 後台相關服務將暫停 8 小時
iOS 開發需要哪些硬體條件?

TAG:iOS開發 | iOS | 移動開發 |