2三、iOS面試題-Five

技術

高級

1.UITableview的優化方法(緩存高度,異步繪製,減小層級,hide,避免離屏渲染)html

緩存高度

提早計算好 cell 的高度和佈局ios

// 關於UITableView有兩個重要的方法 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath; - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath;

iOS8後,會邊滑動邊調用heightForRowAtIndexPath:這個方法; 想一想一下, 若是把計算cell高度的方法寫在這兒, 不只每次都會調用計算方法, 並且重複滑動的話, 還會再次計算; 因此咱們通常在網絡請求結束後,更新界面以前就把每一個 cell 的高度算好,緩存到相對應的 model 中。面試

異步繪製

在Cell上添加系統控件的時候,實質上系統都須要調用底層的接口進行繪製,當咱們大量添加控件時,對資源的開銷也會很大,因此咱們能夠索性直接繪製,提升效率。數據庫

//異步繪製 dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ CGRect rect = CGRectMake(0, 0, 100, 100); UIGraphicsBeginImageContextWithOptions(rect.size, YES, 0); CGContextRef context = UIGraphicsGetCurrentContext(); [[UIColor lightGrayColor] set]; CGContextFillRect(context, rect); //將繪製的內容以圖片的形式返回,並調主線程顯示 UIImage *temp = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); // 回到主線程 dispatch_async(dispatch_get_main_queue(), ^{ //code }); });
減小層級

減小SubViews的數量, 在滑動的列表上,多層次的view會致使幀數的降低。
例如: 繪製 cell 不建議使用 UIView,建議使用 CALayer。
從形式來講:UIView 的繪製是創建在 CoreGraphic 上的,使用的是 CPU。CALayer 使用的是 Core Animation,CPU,GPU 通吃,由系統決定使用哪一個。View的繪製使用的是自下向上的一層一層的繪製,而後渲染。Layer處理的是 Texure,利用 GPU 的 Texture Cache 和獨立的浮點數計算單元加速 紋理 的處理。緩存

從事件的響應來講:UIView是 CALayer 的代理,layer自己並不能響應事件,由於layer是直接繼承自NSObject,不具有處理事件的能力。而 UIView 是繼承了UIResponder 的,這也是事件轉發的角度上說明,view要比單純的layer複雜的多。多層次的view再加上各類手勢的處理勢必致使幀數的降低。網絡

hide

儘可能少用addView給Cell動態添加View,能夠初始化時就添加,而後經過hide來控制是否顯示框架

避免離屏渲染

爲了保證TableView的流暢,當快速滑動的時候,cell必須被快速的渲染出來。因此cell渲染的速度必須快。如何提升cell的渲染速度呢?less

  • 當有圖像時,預渲染圖像,在bitmap context先將其畫一遍,導出成UIImage對象,而後再繪製到屏幕,這會大大提升渲染速度。具體內容能夠自行查找「利用預渲染加速顯示iOS圖像」相關資料。
  • 渲染最好時的操做之一就是混合(blending)了,因此咱們不要使用透明背景,將cell的opaque值設爲Yes,背景色不要使用clearColor,儘可能不要使用陰影漸變等
  • 因爲混合操做是使用GPU來執行,咱們能夠用CPU來渲染,這樣混合操做就再也不執行。能夠在UIView的drawRect方法中自定義繪製。

固然除了這些, 還有其餘的優化方法:異步

  • 正確地使用UITableViewCell的重用機制
  • 避免阻塞主線程
  • 按需加載
  • 儘量重用開銷比較大的對象
  • 儘可能減小計算的複雜度

2.有沒有用過運行時,用它都能作什麼?(交換方法,建立類,給新建立的類增長方法,改變isa指針)
iOS模式詳解—「runtime面試、工做」看我就 🐒 了 ^_^.async

3.看過哪些第三方框架的源碼?都是如何實現的?(若是沒有,問一下多圖下載的設計)
iOS經常使用開源框架、技術博客、軟件、插件等
我也沒有認真閱讀過源碼, 因此附上幾個框架的實現原理, 僅供參考:
SDWebImage
iOS之SDWebImage的實現原理
AFNetworking
AFNetworking到底作了什麼?
MBProcessHUD
MBProcessHUD-分析、模仿與學習
Masonry
iOS自動佈局框架-Masonry詳解
MJRefresh
iOS MJRefresh源碼分析
YYKit
第三方框架學習—YYKit
FMDB
數據庫第三方框架FMDB詳細講解

至於多圖下載, 下面但是標準答案(出題者寫的), 因此曉得爲何問你了吧, O(∩_∩)O哈哈~
詳解 iOS 多圖下載的緩存機制

4.SDWebImage的緩存策略?
sd加載一張圖片的時候,會先在內存裏面查找是否有這張圖片,若是沒有會根據圖片的md5(url)後的名稱去沙盒裏面去尋找,是否有這張圖片,若是沒有會開闢線程去下載,下載完畢後加載到imageview上面,並md(url)爲名稱緩存到沙盒裏面。
附:(代碼解讀)
SDWebImage緩存機制

5.AFN爲何添加一條常駐線程?
若是沒有常住線程的話,就會每次請求網絡就去開闢線程,完成以後銷燬開闢線程,這樣就形成資源的浪費,而開闢一條常駐線程,就能夠避免這種浪費,咱們能夠在每次的網絡請求都添加到這條線程。

6.KVO的使用?實現原理?(爲何要建立子類來實現)
KVO(Key Value Observe)
iOS開發-- KVO的實現原理與具體應用
建立子類
每一個對象都有isa 指針,指向該對象的類,它告訴 Runtime 系統這個對象的類是什麼。因此對象註冊爲觀察者時,isa指針指向新子類,那麼這個被觀察的對象就神奇地變成新子類的對象(或實例)了。

7.KVC的使用?實現原理?(KVC拿到key之後,是如何賦值的?知不知道集合操做符,能不能訪問私有屬性,能不能直接訪問_ivar)
KVC(Key Value Coding)
iOS開發技巧系列---詳解KVC(我告訴你KVC的一切)

相關文章
相關標籤/搜索