iOS UItableview重用机制

重用机制的定义就是一个节省内存的机制,当我们的tableview有100或更多数据是如果没有重用机制那样会把内存很快占满 尤其使大多数我们在cell上面放上图片,图片是一个很占内存的东西  所以我们需要重用机制来解决,重用机制就是在我们屏幕的可显示范围内创建cell 其余的复用这些cell,以我个人的理解就是例如在我们可视范围内创建10cell,当我们向上滑动是我们cell时 cell(0)就会进入重用队列,当我们的cell(10)显示时就会从重用队列里面取出来cell(0)来进行重用它 ,这好比就是一个循环利用的过程 而重用队列就是一个容器,为了不让我们常创建的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 那样是不是代价太高了

这里就不用代码演示了,因为太晚了 ,谅解......  



本博文纯属个人理解,如有大神嫁到,请稍加提点







  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值