• 重用UITableViewCell对象的概念


    重用UITableViewCell对象

    • UITableView控件十分常见,基本上我们随意打开一款App都能见到,它被用来列表展示数据,而其中的每一行内容都是一个cell对象
    • 我们知道手机设备上的内存有限,如果某个列表包含很多行的内容,也就是说要创建很多个cell对象的话,内存资源很快就会被消耗殆尽
    • 为了解决这个问题,系统提供了一个重用cell对象的途径 —— 对象池
    • 当用户滚动UITableView对象时,部分cell对象会移出窗口。此时UITableView对象会将移出窗口的cell对象放入UITableView对象池,等待重新利用。当UITableView对象要求数据源返回某个cell对象时,数据源可以先查看对象池。如果有未使用的cell对象,就可以用新的数据配置这个cell对象,然后将其返回给UITableView对象,从而避免创建新对象。
    • 从对象池获取cell对象时,由于无论取回的是哪个对象都要重新设置数据,所以无须关心具体是取得哪个特定对象。真正需要关心的是取回的对象是否是某个特定的类型(比如当我们在列表某些行上所展示的内容与其它行的结构不一样时,就需要创建其它类型的cell了)。因此系统提供了一个类型为NSString的reuseIdentifier属性,可以用作类型的身份标识。
    • 相关实现代码
    -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
    {
        //0.设置静态局部变量
        static NSString *ID = @"car";
        //1.取对象池中可循环利用的cell,系统具体取哪个cell是不确定的
        UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:ID];
        //2.如果没有池中就自己创建
        if (!cell) {
            cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:ID];
            //调用次数测试
            NSLog(@"%s",__func__);
        }
        //3.设置数据
        cell.textLabel.text = [NSString stringWithFormat:@"第%zd行数据",indexPath.row];
        //4.返回数据
        return cell;
    }
    
    • 还可以通过在viewDidLoad方法中提前注册的方式:当数据源在对象池中取cell时会进行判断,如果之前已经注册过了相应标识的cell,它会自己创建相应cell,因此如果添加了提前注册的代码语句后就不需要if语句做判断手动创建cell了
    [self.tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:ID];
    
    • 缺点是没法在创建时设置样式initWithStyle,一般用于自定义cell
  • 相关阅读:
    Project和Module的介绍
    2016-10-27~2016-11-12面试总结
    读写分离的概念(转)
    hashmap和hashtable,arraylist和vector的区别
    如何删除数据库表的重复数据
    Iterator和ListIterator的区别
    性能提升
    Oracle 查询并修改
    oracle数据库中VARCHAR2(50 CHAR) 和VARCHAR2(50) 有啥区别?
    SQL SERVER 2000安装教程图文详解
  • 原文地址:https://www.cnblogs.com/ShaRuru/p/5052501.html
Copyright © 2020-2023  润新知