TableView重用機制及常見問題_第1頁
TableView重用機制及常見問題_第2頁
TableView重用機制及常見問題_第3頁
TableView重用機制及常見問題_第4頁
TableView重用機制及常見問題_第5頁
已閱讀5頁,還剩4頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

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

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

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

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

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

6、當單元格滾出屏幕時,允許恢復單元格以便重用。 TableView 自我管理的重用方法 dequeueReusableCellWithIdentifier ,這個方法列一個已經存在 的單元格, 假如沒有可以重用的單元格那么就返回 nil 。合理 的使用重用機制會對程序的內存使用和優化都有很重要的 作用。 查看 TableView 頭文件,會找 NSMutableArray *visiableCells 和 NSMutableDictnery *reusableTableCells 兩個 結構。visiableCells 內保存當前顯示的 cells, reusableTableCells 保存可

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

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

9、ellll 完全顯示出來的時候。 cell11 加入到 visiableCells, cell1 移出 visiableCells , cell1 加入到 reusableTableCells。 接著向上拖動 tableView ,因為 reusableTableCells 中已 經有值, 所以, 當需要顯示新的 cell, cellForRowAtIndexPath 再次被調用的時候, tableView dequeueReusableCellWithIdentifier :CellIdentifier ,返回 cell1 。 cell1 加入到 visiableCells , cell1

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

11、上,就會取出并使用這個重用的 cell 顯示在無任何子 視圖的 cell 中,這個時候就會出現問題。 新建一個工程,在 .xib 繪制一個 TableViewCell ,在上面 顯示“我是一個標簽 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 : 我是一個標 簽%d, indexPath.row ; / 在 cell 上添加 label cell.contentView addSubview : label ; return cel

13、l ; 拖動 TableView ,如圖 1 所示,多個視圖出現重疊: 原因分析:拖拽視圖,根據 TableView 重用機制,新滑 入的 Cell 會重用滑出的 Cell 空間,然后再 add 一個新的 Lable , 這樣就會造成兩個 Lable 文字的疊加,前面的文字變黑,后 面的數字疊加在一起。 4 UITableView 重用機制解決方案 為了解決重用機制下的上述問題,本文給出了兩種解決 方案: 方案 1、在 cell 創建前,先把 subview 移除,從而得到 一個沒有特殊格式的 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 : 我是一個標 簽%d, indexPath.row; cell.contentView addSubview :labe

16、l; return cell ; 方案 2、在 TableViewCell 上添加一個 Label,將 Lable 固化在 Cell 上,設計效果如圖 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 : 我是一個標 簽%d, indexPath.row; 運行,測試結果顯示上述兩種方法, 都可以將重疊的 bug 成功去除,效果如圖 2 所示。 5 內存消耗分析 在程序設計的時候,只之所以使用 TableView 的重用機 制,是為了使用較少的內存。 比較上面兩種方案如圖 4 所示, 我們發現第二種方案其 CP

溫馨提示

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

最新文檔

評論

0/150

提交評論