用xib自定義UITableViewCell的注意事項——重用問題

問題的提出:緩存

有時候咱們常常須要自定義tableView的cell,當cell裏面的佈局較爲複雜時每每捨棄純代碼的方式而改用xib的方式進行自定義。當咱們用純代碼的方式佈局cell時,每每會在cell的initWithStyle: reuseIdentifier: 方法裏面用純代碼進行佈局,而後在外部VC的cellForRowAtIndexPath方法裏面咱們會這麼寫,假定自定義的cell爲Cell,繼承自UITableViewCell:ruby

static NSString *CellIdentifier = @"Cell"; Cell *cell = (Cell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier]; if (!cell) { cell = [[[Cell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease]; } cell.titleLabel.text = [self.dataList objectAtIndex:indexPath.row]; return cell;

上述這麼寫徹底沒有問題,由於教科書跟各類教程都是這麼寫的,上述代碼對cell進行了重用。但若是咱們如今想用xib來佈局呢?看到過很多代碼是這麼寫的:函數

static NSString *CellIdentifier = @"Cell"; Cell *cell = (Cell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier]; if (!cell) { cell = [[[NSBundle mainBundle] loadNibNamed:NSStringFromClass([Cell class]) owner:self options:nil] objectAtIndex:0]; //cell = [[[Cell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease]; } cell.titleLabel.text = [self.dataList objectAtIndex:indexPath.row];return cell;

惟一區別的地方在於紅色的位置:cell的初始化再也不經過initWithStyle函數,由於咱們如今用xib佈局,全部的控件信息都在xib裏面,所以咱們根據Cell所對應的xib名稱來加載xib以建立cell。可是你注意到沒,第二種方法的紅色部分並無包含任何重用信息,也就是說,每次拖動tableview,都會一直建立不一樣的cell,當要顯示的cell不少時內存問題就顯露出來了。佈局

爲了解決這個問題,咱們換用另外一種更好的方式。性能

直接放優化後的代碼,UINib類能夠先不看,不影響代碼的理解:大數據

static NSString *CellIdentifier = @"Cell"; BOOL nibsRegistered = NO; if (!nibsRegistered) { UINib *nib = [UINib nibWithNibName:NSStringFromClass([Cell class]) bundle:nil]; [tableView registerNib:nib forCellReuseIdentifier:CellIdentifier]; nibsRegistered = YES; } Cell *cell = (Cell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier]; cell.titleLabel.text = [self.dataList objectAtIndex:indexPath.row]; return cell;

咱們能夠看到,紅色部分很好地知足了咱們的需求:既從nib加載,又能對cell進行重用。下面對代碼進行解釋:優化

1.UINib是一個IOS4.0纔出現的類,與MAC上的NSNib類做用類似, 就是加速頻繁使用的NIB文件的加載。在第一次從硬盤加載NIB時,它在內存中緩存NIB文件對象。以後加載NIB文件時就會從內存拷貝而避免了較慢的硬盤訪問。Apple宣稱能夠在 加載NIB文件時提供 2倍的速度提高 。 使用UINib的最明顯的地方就是在須要在每次建立新Cell時從NIB文件中加載Cell的UITableViewControllers中。UINib的優點就是在不用大量修改代碼的狀況得到性能改進。其實簡單地說,就是利用緩存機制避免了頻繁從硬盤中加載XIB文件,這在大數據量的時候顯得尤其有用。spa

2.除了上述代碼,還須要在xib文件中作以下設置:在Cell.xib的Inspector窗口中將Identifier進行設置,這裏的Identifier要與cellForRowAtIndexPath中一致。regexp

以上就是從xib加載自定義UITableViewCell的注意事項以及解決方案,不少人採用了第二種方法,看起來雖然沒問題可是一旦內存吃緊的時候問題就暴露出來了!對象

 

 

以前的代碼就是第2種寫法,之前也沒有仔細考慮過這個問題,今天心血來潮,想到了這個問題,百度一下,才發現果真有問題。

相關文章
相關標籤/搜索