UITableView的重用机制
iphone重用机制是苹果为了实现大量数据显示而采用的一种节省内存的机制,比如在UITableView和ScrollView 等地方。为什么要“可重用”???对于我们的项目来说,内存控制是必不可少的,如果一个tableview有几百个cell,这个内存消耗是很大的,而且有些cell里面都有image之类的很占内存的资源存在的话,那这样很容易出现memory warning甚至crash掉,这不是我们想要看到的。对此,tableview实现了它自己的管理方法dequeueReusableCellWithI
但是在实际使用过程中,会有以下问题:
1、(苹果文档中不鼓励我们在UITableViewCell中添加subView,最好采用自定义Cell,将需要的SubView添加到Cell当中。)使用addSubView在每项上添加视图的时候会有重叠的现象。例如,UITableView中的Cell ,如果在cell上添加子视图,则在使用苹果的重用机制的时候,会重现子试图重叠的现象。或出现开头提到的两个问题。如果在数据量不是很多的时候,可以手动屏蔽掉UITableView的重用机制。
这里不得不提一下UITableView的重用机制:
UITableView的重用机制的实现关键在于下面这个的函数:
UITableViewCell *cell = [tableView dequeueReusableCellWithI
接下来我们就要使用多种的方法来干掉这个重用机制:
(1):
UITableViewCell *cell = [tableView dequeueReusableCellWithI
if (cell != nil) {
[cell release];
}
(2):和(1)的方法本质一样,略显啰嗦。
UITableViewCell *cell =[tableView dequeueReusableCellWithI
if (cell == nil) {
cell = [[[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefa
}
NSArray*subviews = [[NSArray alloc]initWithArray:cell.contentView.subviews];
for (UIView *subview in subviews) {
[subview removeFromSuperview];
}
[subviews release];
(3)://组别都不一样,看你怎么重用。
NSString *CellIdentifier = [NSString stringWithFormat:@"cell%d",indexPath.row];
UITableViewCell *cell = [tableView dequeueReusableCellWithI
{
........
} else {
return cell;
}
虽然干掉了重构机制,但我还是时不时地会想念它,特别是在数据多的时候,使用重用机制会好对你的程序的内存使用和优化都有很重要的作用。 但是这样的话,如果想再cell上添加东西的话,重叠现象会很严重。好吧,鱼和熊掌捆绑销售啦啦!!使用xib给cell添加视图来添加视图吧......
具体步骤:
(1)新建一个基于UITableViewCell的类A和一个空白的xib。
(2)在A类中声明要添加的视图,例如IBOutlet UILabel *nameLabel,*timeLabel; ,注意:一要是使用
(3)将xib中的view删除,拖一个 UITableViewCell,然后将这个UITableViewCell的类改为基于A。再把相应的视图添在UITableViewCell上,并且与A类内定义的变量进行连接。这样准备工作就完成了。
(4)使用方法:
补充:在使用地图MKMapView一会使用到重用机制,如果想要在MKPinAnnotationView添加视图的话,最好放弃那个重用机制,要不然效果会乱七八糟的(估计还有更好的处理方法)~~