iphone重用机制浅析

本文探讨了iPhone重用机制在UITableView中的应用及其实现细节,分析了使用该机制时可能出现的问题,如视图重叠,并提供了使用xib文件解决此问题的方法。此外,还介绍了一种不使用xib的替代方案。
摘要由CSDN通过智能技术生成

iphone重用机制是苹果为了实现大量数据显示而采用的一种节省内存的机制,但是在实际使用过程中,会有以下问题:

1、使用addSubView在每项上添加视图的时候会有重叠的现象。例如,UITableView中的Cell ,如果在cell上添加视图,则在使用苹果的重用机制的时候,会重现重叠的现象。刚开始学习的时候,觉得这个重用不太合适,原因:在数据不是很多的时候,个人觉得使用不使用重用机制都可以,于是乎,干脆放弃使用这套机制。代码如下:

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell != nil) {
        [cell release];
    }

但是在数据多的时候,感觉使用重用机制会好对你的程序的内存使用和优化都有很重要的作用。 但是这样的话,如果想再cell上添加东西的话,重叠现象会很严重。偶然间,使用xib给cell添加视图,发现不会出现重叠的现象。

具体步骤

(1)新建一个基于UITableViewCell的类A和一个空白的xib。

(2)在A类中声明要添加的视图,例如IBOutlet UILabel *nameLabel,*timeLabel; ,注意:一要是使用IBOutlet

(3)将xib中的view删除,拖一个 UITableViewCell,然后将这个UITableViewCell的类改为基于A。再把相应的视图添在UITableViewCell上,并且与A类内定义的变量进行连接。这样准备工作就完成了。

(4)使用方法:

                 A* cell = (A*)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];
                 if (cell == nil) {
                         NSArray* nib = [[NSBundle mainBundle] loadNibNamed:@"VideoCell" owner:self options:nil];
                         cell = [nib objectAtIndex:0];
                 }

然后只需在下面改变cell相应视图的属性就可以了。

补充:在使用地图MKMapView一会使用到重用机制,如果想要在MKPinAnnotationView添加视图的话,最好放弃那个重用机制,要不然效果会乱七八糟的~~

2、我相信很多人都会好奇这套重用机制怎么实现的?我也很好奇,一直没找到相关的文档。不过有些认为就是建一个队列或者池子,如果UITableViewCell过多的话,它就会自动清除一些cell,然后如果比较少,它就会自动在这个队列或池子里面添加元素,这样避免了许多使用相同的Style 的Cell。

PS:还是好好研究下C语言的内存管理吧,我觉得那个才是真真意义上的内存管理。OC内存管理还是比较简单的。

更正:今天查别的问题的时候偶尔看到一个老外写的UITableView的代码,发现了一种新的实现方式。实现方式如下:

    1、cell的释放使用默认的释放:

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[[
UITableViewCell alloc] init....] autorelease];

        UITextField *field = ...;//初始化

        [cell addSubView:field];//添加

        [field release];//释放        

    }

     2、通过遍历修改UILabel属性

  UITextField*field = nil;

   for(UIView *v in cell.contentView.subviews)

   {

         if([v isMemberOfClass:[UILabel class]])

             field = (UITextField *)v;

   }

   ......//修改field的属性

这种方法不敢说有多好,但是给我们提供了一种解决方案,看大家的喜好了``` 例如不喜欢xib的,可以尝试下,-.-


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值