1.UITableView的復(fù)用機(jī)制
首先我們看蘋果所給出的優(yōu)化方案:
TableViewCell有一個(gè)緩存池機(jī)制,如果cell完全移出了視線外(即屏幕之外),則將這個(gè)cell存放到緩存池之中,等待復(fù)用;
為了區(qū)別每一種不同的cell,將每種不同的cell綁定上一個(gè)identifier,在顯示新的cell的時(shí)候,delegate會通過identifier決定出現(xiàn)哪種cell;
UITableView每當(dāng)顯示一個(gè)新的cell的時(shí)候,都會去調(diào)用其Delegate的方法
- (UItableViewCell *)tableView:(UITableView *)tableView
cellForRowAtIndexPath:(NSIndexPath *)indexPath {
}
方式一:
通常的做法是,從緩存池里面尋找,是否有可以循環(huán)利用的cell?
UITableViewCell * cell = [tableView dequeueReusableCellWithIdentifier:@"cell"];
如果沒有,就重新創(chuàng)建一個(gè)新的cell,這個(gè)cell在創(chuàng)建的時(shí)候,需要綁定一個(gè)identifier;
if (cell == nil) {
cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"cell"];
}
注意這個(gè)identifier,由于這個(gè)返回cell的方法調(diào)用非常頻繁,最好將其用一個(gè)靜態(tài)變量存放起來,避免重復(fù)開辟內(nèi)存;
(被static修飾的局部變量只會初始化一次,在整個(gè)程序的運(yùn)行中只有一份內(nèi)存)
static NSString *identifier = @"cell";
方式二:
如果沒有cell,也可以在viewDidLoad的時(shí)候,進(jìn)行注冊,告訴TableView:將要用到cell的時(shí)候,就創(chuàng)建這個(gè)類型及這個(gè)標(biāo)識的cell;
可以注冊class或者Nib的cell;
[self.newsTableView registerNib:[UINib nibWithNibName:@"JMTableViewCell" bundle:nil] forCellReuseIdentifier:@"cell"];
2.一個(gè)Xib里面創(chuàng)建兩種不同的cell,然后在一個(gè)tableView里面使用
這個(gè)方法比較特殊,在自建的TableViewCell的Xib里面,可以拖入多個(gè)cell,cell的順序要看左邊欄的順序,即最上面的是0,下面一個(gè)是1,等等;
如圖

在這個(gè)方法中,不采用注冊的方法,只需在返回cell的方法中進(jìn)行標(biāo)識區(qū)分即可;
這樣做可以有效地減少工作量,避免新建另一個(gè)Xib,而數(shù)據(jù)又和別的Xib的數(shù)據(jù)一樣;這種重復(fù)勞動(dòng)顯然是不必要的
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
//model對應(yīng)數(shù)據(jù)源的數(shù)組順序
JMNewsModel *model = [[JMNewsModel alloc]init];
model = self.dataArray[indexPath.row];
//創(chuàng)建cell
JMNewsTableViewCell *cell = [[JMNewsTableViewCell alloc]init];
//根據(jù)img_type來確定是哪種cell
//復(fù)用和創(chuàng)建都嵌入if內(nèi)部
if (model.img_type == 2) {
cell = [tableView dequeueReusableCellWithIdentifier:@"iden"];
if (!cell) {
cell = [[[NSBundle mainBundle]loadNibNamed:@"JMNewsTableViewCell" owner:nil options:nil]objectAtIndex:1];
}
}else if (model.img_type == 0) {
cell = [tableView dequeueReusableCellWithIdentifier:@"cell"];
if (!cell) {
cell = [[[NSBundle mainBundle]loadNibNamed:@"JMNewsTableViewCell" owner:nil options:nil]objectAtIndex:0];
}
}
//cell的數(shù)據(jù)賦值
cell.model = model;
return cell;
}