iOSUI视图面试及原理总结
摘要:
1、UITableViewCell的重用機(jī)制描述一下?
2、UITableView相關(guān)的數(shù)據(jù)源同步問題,即如何在tableview解決多線程情況下,數(shù)據(jù)的處理?
3、是否遇到過卡頓和掉幀的問題,如何解決的,為什么出現(xiàn)卡頓和掉幀的問題?
4、繪制原理&異步繪制、什么是離屏渲染
5、圖像顯示的原理描述一下
6、iOS中的事件傳遞流程和視圖響應(yīng)流程
正問:
一、UITableViewCell的重用機(jī)制
在開發(fā)過程中,
- (nullable __kindof UITableViewCell *)dequeueReusableCellWithIdentifier:(NSString *)identifier; - (__kindof UITableViewCell *)dequeueReusableCellWithIdentifier:(NSString *)identifier forIndexPath:(NSIndexPath *)indexPath NS_AVAILABLE_IOS(6_0);有這兩個方法調(diào)起UITableViewCell方的重用機(jī)制,在tableview新建的時候,會新建一個復(fù)用池viewreusepool,這個復(fù)用池在oc底層可能是一個隊列,保存著當(dāng)前cell.pool中的復(fù)用標(biāo)識符就是reuseIdentifier,標(biāo)識著不同種類的cell,所以當(dāng)我們調(diào)用dequeueReusableCellWithIdentifier時,會通過當(dāng)前reuseIdentifier查找到對應(yīng)的cell,也就是展示的原型。
在創(chuàng)建tableview的時候,會創(chuàng)建一個空的viewreusepool,然后在tableview內(nèi)部對pool進(jìn)行管理,一般有兩種用法,一種是取出一個空的cell的時候再去創(chuàng)建新的cell,另外一種是預(yù)先注冊cell,之后再直接從復(fù)用池取出來用,不需要初始化.
對于第一種用法:第一次調(diào)用tableView:cellForRowAtIndexPath由于復(fù)用池是空的,會首先創(chuàng)建cell添加到復(fù)用池中,第二次調(diào)用,當(dāng)前復(fù)用池中有一個cell,這時候因為talbeview上面還未填滿,而且復(fù)用池的唯一的那個cell已經(jīng)在使用了,所以取出來的cell仍然為nil,于是繼續(xù)新建一個cell并返回,復(fù)用池再添加一個cell,當(dāng)前復(fù)用池中cell的個數(shù)為2.假如當(dāng)前tableview只能容納5個cell.那么在滾動到第6個cell時,從tableview的復(fù)用池取出來的cell將會是第0行的那個cell.以此類推,當(dāng)滾動到第7行時,會從復(fù)用池取出來第1行的那個cell. 另外,此時不再繼續(xù)往復(fù)用池添加新的cell.
二、uitableview的數(shù)據(jù)源同步問題
如何解決在tableview中多線程情況下數(shù)據(jù)同步的問題?
有兩種情況一:1、并行訪問,數(shù)據(jù)拷貝,2、串行訪問。
三、是否遇到過卡頓和掉幀的問題,如何解決的,為什么出現(xiàn)卡頓和掉幀的問題
首先卡頓是在規(guī)定的的16,7ms之內(nèi),下一幀sync信號到來之前,并沒有cpu和gpu共同完成下一幀頁面的合成,于是就會造成卡頓和掉幀。。
滑動優(yōu)化方案:cpu:1、處理對象的創(chuàng)建、調(diào)整、銷毀工作;2、欲排版(布局計算、文本計算);3、欲渲染(文本等異步繪制、圖片解碼等)gpu:1、紋理渲染;2、視圖混合
四、繪制原理&異步繪制
繪制原理:
?
GPU屏幕渲染有以下兩種方式:
1、當(dāng)前屏幕渲染(On-Screen Rendering)
指的是在當(dāng)前屏幕緩沖區(qū)內(nèi)進(jìn)行渲染
2、離屏渲染(Off-Screen Rendering)
指的是在當(dāng)前屏幕緩沖區(qū)以外新開辟的一個緩沖區(qū)進(jìn)行渲染操作
離屏渲染:
當(dāng)我們處理圖層的屬性在被指定為未被預(yù)合成之前不能直接在屏幕上顯示,就觸發(fā)了離屏渲染,離屏渲染的概念起源于cpu層面,值得是cpu在當(dāng)前屏幕緩沖區(qū)以外新開辟一個緩沖區(qū)進(jìn)行渲染操作。
離屏渲染何時被觸發(fā)?1、圓角(當(dāng)和maskToBounds一起使用時,單獨的圓角不觸發(fā));2、圖層蒙版;3、陰影;4、光柵化;5、漸變
?
特殊的離屏渲染:CPU渲染?如果我們重寫了drawRect方法,并且使用任何Core Graphics的技術(shù)進(jìn)行了繪制操作,就涉及到了CPU渲染。整個渲染過程由CPU在App內(nèi) 同步地完成,渲染得到的bitmap最后再交由GPU用于顯示。
?
要盡量避免使用離屏渲染:1、上下文切換,gpu需要額外的開銷;2、創(chuàng)建新的渲染緩沖區(qū),內(nèi)存消耗;
高級回答:觸發(fā)離屏渲染會增加gpu的工作量,而增加了gpu的工作量很有可能導(dǎo)致cpu和gpu的工作總耗時超過了15.67ms,從而造成頁面的卡頓和掉幀。
轉(zhuǎn)載于:https://www.cnblogs.com/codingStorys/p/9442016.html
總結(jié)
以上是生活随笔為你收集整理的iOSUI视图面试及原理总结的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 招商银行信用卡申请条件
- 下一篇: ambari 维护模式及reset AP