Uitableviewcell 的重用就是为了性能优化。
为什么需要性能优化
UITableView中的cell是在显示到用户可视区域后创建的,若用户反复上下滚动,内存会飙升。即一直在调用
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
若有效的编写此函数内代码会有极大提高性能。
UITableViewCell的性能优化方法
UITableViewCell 初始化方法,此方法每次都会重新创建UITableViewCell。
UITableViewCell *cell=[[UITableViewCell alloc]initWithStyle:UITableViewCellStyleValue1 reuseIdentifier nil];
UITableView内部有个缓冲池,可以从缓冲池中获取cell,那么就不需要每次重新创建UITableViewCell。
在缓冲池中创建UITableViewCell。使用initWithStyle:(UITableViewCellStyle)reuseIdentifier:(NSString *),代码如下
static NSString *cellName = @"Cell";//由于此方法调用十分频繁,cell的标示声明成静态变量有利于性能优化
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier:cellName];//从缓冲池中获取cell
if(!cell) {//获取不到
cell = [UITableView initWithStyle:XX reuseIdentifier:cellName];//在缓冲池中创建
}
自定义UITableViewCell的重用
需要在其类中重写initWithStyle
- (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier {
self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
if(self) {
//控件
[self initSubView];
}
return self;
}
table间隔视图的重用
代码如下
UITableViewHeaderFooterView *view =[tableView dequeueReusableHeaderFooterViewWithIdentifier:@""];
if(!view) {
view = [[UITableViewHeaderFooterView alloc]initWithReuseIdentifier:@""];
}
给UITextField增加事件
若UITableViewCell中带有UITextField,对UITextField操作可用方法:
[theTextField addTarget:selfaction:@selector(textFieldWithText:)forControlEvents:UIControlEventEditingChanged];
在UITableViewCell内默认是有contentView和accessoryView这两个subView。contentView中的subview根据不同的cell的style会使用不同的布局。Contentview和其中的默认subview会根据cell的编辑状态出现的控件自动缩进,自定义cell时可以把自定义控件添加在contentview中,可以直接添加到cell中。
从xib加载自定义的UITableViewCell
NSArray *nibs = [[NSBundle mainBundle]loadNibNamed:@“cellName” owner:nil options:nil];
//因为此方法返回的是数组,(如图所示)需要找出指定的cell
for(id in nibs) {
if([oneObj isKindOfClass:UITableViewCell]) {
return oneObj;
}
}
下图是loadNibNamed,苹果文档中返回值解释如下
一般情况下可直接使用如下方式获取
cell = [[[NSBundle mainBundle]loadNibNamed:@“cellName” owner:nil options:nil]lastObject];
参考文献:1. http://www.cnblogs.com/kenshincui/p/3931948.html#performance