




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 航空航天裝備研發項目可行性研究報告(參考范文)
- 新疆維吾爾自治區烏魯木齊市第97中學(金英外國語學校)2022-2023學年高一上學期期中政治含解析
- 江蘇省徐州市銅山區2023-2024學年高一上學期期中考試物理含解析
- 周口職業技術學院《家政職業經理人》2023-2024學年第二學期期末試卷
- 安徽審計職業學院《公共服務質量管理》2023-2024學年第二學期期末試卷
- 山東財經大學燕山學院《國家公務員制度》2023-2024學年第二學期期末試卷
- 湖北汽車工業學院科技學院《機械制圖(上)》2023-2024學年第二學期期末試卷
- 長白山職業技術學院《DataStructure》2023-2024學年第二學期期末試卷
- 四川職業技術學院《環境同位素原理與技術》2023-2024學年第二學期期末試卷
- 青島幼兒師范高等專科學校《專業技能訓練數據庫應用系統開發實驗教學》2023-2024學年第二學期期末試卷
- 統考考生本科志愿樣表
- 人教鄂教版六年級下冊科學全冊知識點匯總
- 新航道托福雅思培訓班
- 數車實訓圖紙
- 1小學英語教師面試:聽力課SpecialdaysinApril全英文教案及試講逐字稿
- 人教版小學數學一年級下冊期末黃岡測試卷(三)
- GB/T 38058-2019民用多旋翼無人機系統試驗方法
- GB/T 35354-2017船舶和海上技術大型游艇甲板起重機和登船梯強度要求
- 湖南省2023年普通高等學校對口招生考試電子電工
- 閱讀訓練,(數句子)
- GA/T 1498-2018法庭科學剪切工具痕跡檢驗規范
評論
0/150
提交評論