1、基本介紹緩存
在iOS中,要實現表格數據展現,最經常使用的作法就是使用UITableView,UITableView繼承自UIScrollView,所以支持垂直滾動,⽽且性能極佳 。性能
UITableView有兩種風格:UITableViewStylePlain和UITableViewStyleGrouped。這二者操做起來其實並無本質區別,只是後者按分組樣式顯示,前者按照普通樣式顯示而已。先看一下二者的應用:spa
2、UItableview展現數據的過程對象
♥ UITableView須要一個數據源(dataSource)來顯示數據
♥ UITableView會向數據源查詢一共有多少行數據以及每⼀行顯示什麼數據等blog
♥ 沒有設置數據源的UITableView只是個空殼繼承
♥ 凡是遵照UITableViewDataSource協議的OC對象,均可以是UITableView的數據源 內存
♥ 展現數據的過程:字符串
(1)調用數據源的下面⽅法得知一共有多少組數據it
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView;io
(2)調用數據源的下面⽅法得知每一組有多少行數據
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section;
(3)調⽤數據源的下⾯⽅法得知每⼀⾏顯示什麼內容
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath;
注意:UItableview在默認狀況下是 UITableViewStylePlain,能夠在右側設置style
3、自帶的UITableViewCell
一、UITableViewCell的結構
二、cell的重複使用原理
iOS設備的內存有限,若是用UITableView顯示成千上萬條數據,就須要成千上萬個UITableViewCell對象的話,那將會耗盡iOS設備的內存。要解決該問題,須要重用UITableViewCell對象
♥ 重用原理:當滾動列表時,部分UITableViewCell會移出窗口,UITableView會將窗口外的UITableViewCell放入一個對象池中,等待重用。當UITableView要求dataSource返回UITableViewCell時,dataSource會先查看這個對象池,若是池中有未使用的UITableViewCell,dataSource會用新的數據配置這個UITableViewCell,而後返回給UITableView,從新顯示到窗口中,從而避免建立新對象
還有一個很是重要的問題:有時候須要自定義UITableViewCell(用一個子類繼承UITableViewCell),並且每一行用的不必定是同一種UITableViewCell,因此一個UITableView可能擁有不一樣類型的UITableViewCell,對象池中也會有不少不一樣類型的UITableViewCell,那麼UITableView在重用UITableViewCell時可能會獲得錯誤類型的UITableViewCell
解決方案:UITableViewCell有個NSString *reuseIdentifier屬性,能夠在初始化UITableViewCell的時候傳入一個特定的字符串標識來設置reuseIdentifier(通常用UITableViewCell的類名)。當UITableView要求dataSource返回UITableViewCell時,先經過一個字符串標識到對象池中查找對應類型的UITableViewCell對象,若是有,就重用,若是沒有,就傳入這個字符串標識來初始化一個UITableViewCell對象
4、cell的重用代碼
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { // 1.定義一個cell的標識 static NSString *ID = @"mjcell"; // 2.從緩存池中取出cell UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:ID]; // 3.若是緩存池中沒有cell if (cell == nil) { cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:ID]; } // 4.設置cell的屬性... return cell;