问题的提出:缓存
有时候咱们常常须要自定义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种写法,之前也没有仔细考虑过这个问题,今天心血来潮,想到了这个问题,百度一下,才发现果真有问题。