TableView重用機(jī)制及常見問題_第1頁
TableView重用機(jī)制及常見問題_第2頁
TableView重用機(jī)制及常見問題_第3頁
TableView重用機(jī)制及常見問題_第4頁
TableView重用機(jī)制及常見問題_第5頁
已閱讀5頁,還剩4頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、TableView 重用機(jī)制及常見問題 摘 要: IOS 是運(yùn)行在蘋果移動(dòng)設(shè)備上的操作系統(tǒng),它 對(duì)內(nèi)存的控制比較嚴(yán)格。 Tableview 是在 IOS 開發(fā)過程中使 用的最為廣泛的控件之一,常用來以列表的方式顯示資料。 為了解決內(nèi)存消耗問題, TableView 重用機(jī)制發(fā)揮著重要的 作用。本文對(duì) TableView 重用機(jī)制進(jìn)行了詳細(xì)介紹,并指出 了開發(fā)過程中常見的問題。針對(duì)這個(gè)問題,本文給出了兩種 解決方案,并通過內(nèi)存消耗和 CPU 占有率這這個(gè)指標(biāo)進(jìn)行對(duì) 比,得出了第二種方案的更為有效的結(jié)論。 關(guān)鍵詞: TableView 重用機(jī)制;內(nèi)存消耗;解決方案 IOS 是由蘋果公司為 ipho

2、ne 開發(fā)的操作系統(tǒng)。 它主要是 iphone、iPod touch以及iPad使用。就像 Mac OS X操作系統(tǒng) 一樣,它也是以 Darwin 為基礎(chǔ)的。 最新版的 IOS 系統(tǒng)( IOS8) 中,系統(tǒng)操作占用大概 1.1G 的內(nèi)存空間 .后續(xù)的系統(tǒng)預(yù)計(jì)將 占用更多的內(nèi)存。另外, IOS 設(shè)備提供給每個(gè)應(yīng)用軟件使用 的內(nèi)存是有限的 1 。因此, IOS 對(duì)開發(fā)者進(jìn)行內(nèi)存管理的要 求很嚴(yán)格,對(duì)于易于崩潰、有內(nèi)存泄露、以及內(nèi)存占用量過 大的程序,都不能通過蘋果公司的審核。因此, IOS 應(yīng)用軟 件的開發(fā)過程中,內(nèi)存控制需要時(shí)刻注意。 1 TableView 的簡(jiǎn)介 TableView 是 AP

3、P 開發(fā)中使用率最高的一個(gè)常用控件, 基本上每個(gè) view 都會(huì)見到它的身影。 TableView 功能很強(qiáng)大, 除了一般的表格資料展示之外,設(shè)置的屬性資料往往也用到 TableView 。無論是 IOS 設(shè)備自帶的通訊錄、 備忘錄、 提醒事 項(xiàng)等應(yīng)用軟件,還是第三方的微信、微博、陌陌等社交軟件 2 ,都使用了這個(gè)視圖。 TableView 繼承自 ScrollView ,可 以表現(xiàn)為 Plain 和 Grouped 兩種風(fēng)格: Plain 樣式指的是普通 的列表風(fēng)格, 是方形的外觀; Grouped 樣式指的是分塊風(fēng)格, 主要以圓角形顯示。 在 TableView 中的一行稱為 TableV

4、iewCell ,而許多的 TableViewCell 組成了一個(gè) TableSection,每個(gè) TableSection 上下又分 ?e 有 Header 和 Footer ,許多個(gè)的 Table Section 則組 成了整個(gè) Table , Table 也有 Header 和 Footer。TableViewCell 是 TableView 基本組成單元。 2 TableView 的重用機(jī)制 在 IOS 的一些視圖中,它們的內(nèi)部包含子視圖,當(dāng)父視 圖顯示區(qū)域發(fā)生變化時(shí),比如用手滑動(dòng)屏幕,原來在屏幕中 的子視圖就會(huì)滑出到屏幕之外,而原來在屏幕之外的子視圖 就有機(jī)會(huì)進(jìn)入屏幕中 4 。就如上

5、文所述 TableView 常用于資 料的顯示,如果一個(gè) TableView 有幾百個(gè) TableViewCell ,根 據(jù)數(shù)據(jù)個(gè)數(shù)創(chuàng)建相應(yīng)數(shù)量 TableViewCell ,會(huì)占用很大的內(nèi)存 空間 3 。如果在 TableViewCell 里面含有 image 之類的很占 內(nèi)存的資源,這就會(huì)造成應(yīng)用程序在使用 TableView 加載大 批量數(shù)據(jù)時(shí)內(nèi)存占用過大,那這樣很容易出現(xiàn)內(nèi)存警告甚至 崩潰掉,這不是我們想要看到的。因此, TableView 提供了 單元格重用機(jī)制來達(dá)到節(jié)省內(nèi)存的目的:通過為每個(gè)單元格 指定一個(gè)重用標(biāo)識(shí)符 ( reuseIdentifier ),即指定了單元格的種 類;

6、當(dāng)單元格滾出屏幕時(shí),允許恢復(fù)單元格以便重用。 TableView 自我管理的重用方法 dequeueReusableCellWithIdentifier ,這個(gè)方法列一個(gè)已經(jīng)存在 的單元格, 假如沒有可以重用的單元格那么就返回 nil 。合理 的使用重用機(jī)制會(huì)對(duì)程序的內(nèi)存使用和優(yōu)化都有很重要的 作用。 查看 TableView 頭文件,會(huì)找 NSMutableArray *visiableCells 和 NSMutableDictnery *reusableTableCells 兩個(gè) 結(jié)構(gòu)。visiableCells 內(nèi)保存當(dāng)前顯示的 cells, reusableTableCells 保存可

7、重用的 cells。 TableView 顯示之初, reusableTableCells 為空,那么 tableView dequeueReusableCellWithIdentifier : CellIdentifier 返回 nil 。開始的 cell 都是通過 UITableViewCell alloc initWithStyle :UITableViewCellStyleDefault reuseIdentifier :CellIdentifier 來創(chuàng)建,而且 cellForRowAtIndexPath 只是調(diào)用最大顯示 cell 數(shù)的次數(shù)。 比如:有 100 條數(shù)據(jù), iphon

8、e 一屏最多顯示 10 個(gè) cell。 程序最開始顯示 TableView 的情況是: 用UlTableViewCell alloc initWithStyle : UITableViewCellStyleDefault reuseIdentifier : CellIdentifier 創(chuàng) 建 10 次 cell ,并給 cell 指定同樣的重用標(biāo)識(shí)(當(dāng)然,可以為 不同顯示類型的 cell 指定不同的標(biāo)識(shí)) 。并且 10個(gè) cell 全部 都加入到 visiableCells 的隊(duì)列, reusableTableCells 為空。 向上拖動(dòng)tableView ,當(dāng)celll完全移出屏幕,并且c

9、ellll 完全顯示出來的時(shí)候。 cell11 加入到 visiableCells, cell1 移出 visiableCells , cell1 加入到 reusableTableCells。 接著向上拖動(dòng) tableView ,因?yàn)?reusableTableCells 中已 經(jīng)有值, 所以, 當(dāng)需要顯示新的 cell, cellForRowAtIndexPath 再次被調(diào)用的時(shí)候, tableView dequeueReusableCellWithIdentifier :CellIdentifier ,返回 cell1 。 cell1 加入到 visiableCells , cell1

10、移出 reusableTableCells;cell2 移出 visiableCells , cell2 加入到 reusableTableCells。之后再需 要顯示的 Cell 就可以正常重用了。 合理的使用重用機(jī)制會(huì)對(duì) 程序的內(nèi)存使用和優(yōu)化都有很重要的作用。 3 視圖 重疊的問題 在 TableViewCell 中加入 TextField 或者 TextView 等子視 圖,便可以在 cell 上進(jìn)行文字編輯。 但對(duì)于多變的自定義 cell, 如當(dāng)一個(gè) cell 含有一個(gè) UITextField 的子類并被放在重用隊(duì)列 中以待重用,這時(shí)如果一個(gè)未包含任何子視圖的 cell 要顯示 在屏幕

11、上,就會(huì)取出并使用這個(gè)重用的 cell 顯示在無任何子 視圖的 cell 中,這個(gè)時(shí)候就會(huì)出現(xiàn)問題。 新建一個(gè)工程,在 .xib 繪制一個(gè) TableViewCell ,在上面 顯示“我是一個(gè)標(biāo)簽 N ”。核心代碼如下: static NSString* mark = simpleIdentifier ; UITableViewCell* cell=tableView dequeueReusableCellWithIdentifier : mark ; if (! cell ) cell = UITableViewCell alloc initWithStyle : UITableViewCe

12、llStyleDefault reuseIdentifier : mark ; UILabel* label = UILabel alloc initWithFrame : CGRectMake ( 20, 12.0, 150, 20); label.backgroundColor = UIColor clearColor ; label.text = NSString stringWithFormat : 我是一個(gè)標(biāo) 簽%d, indexPath.row ; / 在 cell 上添加 label cell.contentView addSubview : label ; return cel

13、l ; 拖動(dòng) TableView ,如圖 1 所示,多個(gè)視圖出現(xiàn)重疊: 原因分析:拖拽視圖,根據(jù) TableView 重用機(jī)制,新滑 入的 Cell 會(huì)重用滑出的 Cell 空間,然后再 add 一個(gè)新的 Lable , 這樣就會(huì)造成兩個(gè) Lable 文字的疊加,前面的文字變黑,后 面的數(shù)字疊加在一起。 4 UITableView 重用機(jī)制解決方案 為了解決重用機(jī)制下的上述問題,本文給出了兩種解決 方案: 方案 1、在 cell 創(chuàng)建前,先把 subview 移除,從而得到 一個(gè)沒有特殊格式的 cell ,供其他 cell 重用。 核心代碼如下: static NSString* mark =

14、 simpleIdentifier ; UITableViewCell* cell=tableView dequeueReusableCellWithIdentifier : mark ; if (! cell ) cell = UITableViewCell alloc initWithStyle : UITableViewCellStyleDefault reuseIdentifier : mark ; / 獲取 cell 上所有的子視圖 NSArray* subviews = NSArray alloc initWithArray : cell.contentView.subviews

15、; for ( UIView* subview in subviews ) /移除子視圖 subview removeFromSuperview ; UILabel* label = UILabel alloc initWithFrame : CGRectMake ( 20, 12.0, 150, 20); label.backgroundColor = UIColor clearColor ; label.text = NSString stringWithFormat : 我是一個(gè)標(biāo) 簽%d, indexPath.row; cell.contentView addSubview :labe

16、l; return cell ; 方案 2、在 TableViewCell 上添加一個(gè) Label,將 Lable 固化在 Cell 上,設(shè)計(jì)效果如圖 3 所示: 核心代碼如下; static NSString* cellIdentify = TableCell ; UITableViewCell* cell = tableView dequeueReusableCellWithIdentifier :cellIdentify ; if (cell = nil ) /加載 XIB 中自定義的 cell cell = NSBundle mainBundle loadNibNamed : cell

17、Identify owner :self options:nil objectAtIndex :0; UILabel* label = (UILabel* ) cell.contentView viewWithTag :100 ; label.backgroundColor = UIColor clearColor ; label.text = NSString stringWithFormat : 我是一個(gè)標(biāo) 簽%d, indexPath.row; 運(yùn)行,測(cè)試結(jié)果顯示上述兩種方法, 都可以將重疊的 bug 成功去除,效果如圖 2 所示。 5 內(nèi)存消耗分析 在程序設(shè)計(jì)的時(shí)候,只之所以使用 TableView 的重用機(jī) 制,是為了使用較少的內(nèi)存。 比較上面兩種方案如圖 4 所示, 我們發(fā)現(xiàn)第二種方案其 CP

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論