重用机制的定义就是一个节省内存的机制,当我们的tableview有100或更多数据是如果没有重用机制那样会把内存很快占满 尤其使大多数我们在cell上面放上图片,图片是一个很占内存的东西
理解完了重用机制,我们再来看看怎么去解决重用机制给我们带来的一些开发时的小问题,在开发时我们经常会出现tableview上的视图出现层叠的效果而不知所措,但是我们又不得不去面对。
通常我们要自定义cell的时候,我们尽量在通过下面的演示来规避
此代码是 基于arc的环境下的
if(cell==nil){
通常我们这括号里面创建视图并加到cell.contentview
例如:UIImageView *gImageView=[[UIImageView alloc]init];
给它一个tag以便下面得到这个gImageView,因为这是一个局部的变量,所以我们在外面通过tag得到它
gImageView.tag=1000;
[cell.contentView addSubView gImageView]
}
在这里我们并没有重新常见这个view 而是通过tag取的
UIimageView *imageV=(UIImageView*)[cell.contentView viewWithTag:1000];
在外面给他数据,zh
imageV.image=image;
这样就不会创建多个view而导致层叠的
***************在我们通常使用tableview时候我们会去创建一个UITableViewCell的类
在这种情况下我们要了解重用机制,不让它们创建多次
首先将我们要加载的视图声明为成员属性,这样在我的代码中就不会创建多次了,我们在inint方法中取给它声明一个内存空间这里我们给它一个frame=CGRectzero占位,然后将它加在contentView上,然后在下面layoutSubView中给它切确的frame,要不给个事例吧:
----》记住这些都是基于在arc环境下的
-(id)init
{
[super init];
//我们在上面声明的成员属性self.imageV 给它一个CRGRectZero的占位;
self.imageV=[[UIImageView alloc]initWithFrame:CRGRectzero];
//并且在这里添加 到cell上
[self.contentView addSubView:self.imageV]
}
-(void)layoutSubView{
[super layoutSubView];
//在这里根据业务上的需求,我们这里给它Frame,不过我们在使用之前还要再一次将它的frame制成CGRectZero
self.imagev.frame=CGRectZero;这是为了当你下次使用之前再将他的frame制成占位
self.imageV.frame=CGRectMake(X,X,X,X);
这样就会使得在多次显示时 我们只创建一个view,因为他是成员属性了
}
***********还有一种方法虽然可以解决问题 但是这违背了我的重用机制 本人不建议使用
在这里如果是数据量较小的情况下可以使用,但是在数据量较大的情况下这样很危险,它是通过改变了Identifier标识,这就是意味着每个cell的标识都不一样 也就是每条数据都创建一个cell 例子:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
NSString *CellIdentifier=[NSString stringWithForMate:@“%@”,indexPaht];
GWTableViewCell *cell = (GWTableViewCell*)[tableViewdequeueReusableCellWithIdentifier:CellIdentifier];
这样可以解决问题 但是有木有想过 当你有一千条数据时 你是不是要创建1000个cell呢 是不是会占很大的内存呢
}
***********这里还有一种就是通过tag的方法
当我们使用的时候通过tag取的View,然后判断当前cell.contentView是否为空,如果不为空那就remove掉
但是个人觉得这样效率太低了 你想象每当你有条数据展示时 都要remove上一个视图里面的View 那样是不是代价太高了
这里就不用代码演示了,因为太晚了 ,谅解......
本博文纯属个人理解,如有大神嫁到,请稍加提点