標籤:
如何面試一個1-3年的 iOS 程式員(持續更新)
如何面試一個1-3年的 iOS 程式員(持續更新)電腦基礎類
- 請說一說 HTTP 1.0 和 1.1之間的區別(懵逼題)
這是一道電腦類別的題, 具體區別可以單獨寫一篇部落格了, 但是一般情況下, 最主要的區別還是指1.1中支援長串連. 1.0規定的是瀏覽器只能與伺服器保持短串連, 瀏覽器的每次請求都需要跟伺服器建立一次 TCP 串連, 請求處理完以後就立即斷開 TCP 串連, 伺服器不跟蹤每個客戶也不記錄過去的請求. 具體可以看這篇部落格
- 請說一說長串連和短串連的區別
這個和面試官討論了一下, 他堅持問的就是長串連, 短串連. 不是什麼 HTTP 長串連短串連, 也不是 TCP 的長串連短串連, 最後他說區別都是長串連在斷開的和串連的時候都會有一個應答的過程. 求同存異, 這裡順便把 HTTP 長串連短串連的區別以及 TCP 長串連短串連貼出來, 地址
- 請說一說 TCP 和 UDP 的區別
這個的話, 就是一個比較基礎的題目了, 感覺這種問題一般頂多出現在筆試過程中, 答案也比較簡單, 這裡就不佔版面了.
- 關於 TCP和 UDP 的一些其他問題
傳輸大檔案用哪個串連, 安全的是哪個串連等等, 這些問題都比較簡單, 就不再一一贅述
UI 基礎題
- 第一個是萬年常見題目: 說一下你是如何最佳化 tableView 的...
這個問題... 常年流竄於各個公司的面試, 筆試中, 網上也有一份從25個方面來最佳化 tableview 的答案, 但是這個題目的陷阱在於, 為什麼要最佳化 tableView? 如果是一個簡單的 tableView, 那麼按照蘋果開發文檔的步驟來寫, 那麼就根本不需要最佳化. 如果是一個複雜的 tableview, 那麼該緩衝行高的時候, 在 ViewModel 中計算好, 或者在 Controller 中計算好, 然後在 view 出現之前傳給 view, 而不去簡單的調用estimateRowHeight 或者 rowHeightofCell 這些方法, 或者用FDTemplateLayoutCell 這類第三方進行計算, 以及避免離屏渲染, 柵格化圖片這些簡單的低級錯誤, 那麼 tableView 也不需要最佳化.
- 說一說 tableView 的重用機制(筆試題)
tableView 的重用機制很好的解決了 tableView 的記憶體佔用問題, tableView 不必要每建立一個 cell 就去記憶體中開闢一塊新的空間, 每次建立 cell的時候通過 dequeueReusableCellWithIdentifier: 方法來建立, 這時候,系統會先去一個名為緩衝池的地方去尋找指定標識(reuse identifier) 的 cell, 如果沒有, 那就會直接返回nil, 然後再根據 initWithStyle: reuseIdentifier: 建立一個 cell, 而當 cell 離開介面時, 所佔用的記憶體片區就會被存放到緩衝池當中, 以供下次使用. 這是一道送分題
- 說一下控制器的生命週期(筆試題)
- 首先判斷一下控制器是否有視圖, 如果沒有就調用 loadView 方法建立, 要麼是通過 storyboard 或者是代碼
- 調用 viewDidLoad, 進行下一步的初始化操作, 該方法只會被調用一次
- 在視圖顯示之前調用 viewWillAppear, 進入 view 的生命週期, 該函數會在視圖顯示之前都會被調用, 所以有可能會被調用多次
- 在視圖顯示完以後, 調用 viewDidAppear
- 在視圖消失之前, 調用 viewWillDisappear, 同樣, 如果需要, 該方法也會被多次調用
- 如果當前布局需要發生改變, 調用 viewWill/DidLayoutSubviews 去處理相關變化
- 說一說 UIView 和 CALayer 之間的關係(筆試題多一點, 難度較大)
UIView 能夠在螢幕上顯示其實主要還是 CALayer 的功勞, 通過調用 drawRect 方法來渲染自身的內容, 條件 CALayer 屬性可以調整 UIView 的外觀, UIView 繼承自 UIResponder, 能夠響應使用者事件, 這點是 CALayer 做不到的
iOS 系統中所有介面顯示, 介面的元素都是以 UIView 為基礎的, 而 UIView 的內部, 就是靠 CALayer(Core Animation Layer) 的類來管理的. UIView 本身, 更像是 CALayer 的一種管理器吧, CALayer 負責去實現效果, 而 UIView 負責把效果展示出來.
這裡講的只是一點淺薄的知識, 其他的比如可以通過 UIView 的 layer 屬性來獲得對應的 CALayer 的執行個體, 通過 layerClass 方法來獲得對應的主 layer 所使用的類, 而 UIView 的子類, 可以通過override 這個方法, 來讓 UView 使用不同的 CALayer 來顯示
還有包括諸如 UIView 的 CALayer 的樹形結構等等, 太有深度, 一般都不是面試中的主要重點.
- 說一說 loadView ?(筆試題)
loadView 用來自訂view, 只要實現了這個方法, 其他通過 xib 或者 sb 建立的 view 都不會被載入.結合前面的控制器聲明周期中對 loadView 方法的描述.
- 說一說怎樣高效能的給 UIImageView 加圓角(筆試, 爛大街題)
一般都會寫明請不要使用 cornerRadius 屬性.
兩種方法: 一種是最簡單的方法, 請 UI 吃頓飯, 要他/她再幫你切一個跟背景色相同顏色的正方形內切空心圓的圖片就可以了; 另一種麻煩一點, 如果跟 UI 關係不好, 寫個分類什麼的, 在拿到圖片一下, 對圖片重繪一下吧. 就是直接在圖片上面繪製這麼一個遮罩.
- 說一說使用 drawRect 的影響
在實際工作中其實我們會經常使用這個方法來做很多事情, 包括上面的重繪, 以及繪製圖形, 我用這個繪製過圖表, 以及甚至做過動畫, 方法依賴 Core Graphics 架構來進行自訂的繪製, 雖然這個方法非常好用, 但是這個方法還是有缺點的: 就是對 touch 事件不是那麼的友好. 每次處理完 touch 事件, 比如按鈕被點擊以後, 都需要調用一次 setNeedDisplay 這個方法來進行強制重繪. 而且這個重繪操作還不止一次! 每點擊一次會觸發兩次. 所以說, 如果當前這個頁面使用了次 drawRect 來進行繪製, 而繪製的這些按鈕也好, 其他東西也好, 如果會觸發大量的 touch 事件, 那麼對CPU 以及記憶體來講, 都是很不友好的.
再說說 setNeedDisplay 方法, 當調用這個方法的時候, UIKit 就會將當前的layer 標記為 dirty, 但是還是會暫時顯示原來的內容, 知道下一次的視圖渲染周期, 才會將標記為 dirty 的 layer 重建立立Core Graphics 上下文, 然後將記憶體中的資料恢複出來, 再使用 CGContextRef 進行繪製.
如何面試一個1-3年的 iOS 程式員(持續更新)