zoukankan      html  css  js  c++  java
  • (十七)TableView的本地性能优化

    面试中常常会问TableView的性能优化。

    TableView只会加载能看到的Cell,每当有一个Cell进入视野范围内,就会调用。

    存在着内存隐患,如果用户拖动的很快,所以内存会飙升的很快,因此要针对cell的返回方法上进行性能优化。

    优化方案:系统调用这个方法的时候就是为了得到cell,一般的方法就是每次都alloc一个cell,可以设计一个缓存池,当被创建过的cell逃出视野后,将这个cell丢入缓存池,当发现有新的cell要创建的时候,先去缓存池有没有数据,有数据就拿过来然后改数据,否则就alloc一个cell

    一个细节:判断cell的类型是否和当前相符,每次创建cell的时候都给cell绑定一个标识,标识一样才能拿过来用。

    性能优化的步骤:

    1.通过标识去缓存池中找可循环利用的cell。

    2.如果缓存池中找不到可循环利用的cell,创建一个新的cell,给cell贴一个标签。

    3.给cell设置新的数据。

    这个缓存池是系统自动维护的,位于TableView内部,扔到缓存池的操作是系统自动做的,只需要去缓存池拿就可以。

    从缓存池中拿使用的是对象方法dequeue。

    具体做法为:注意为了保证Identifier的一致性,因此最好用变量存储,为了防止变量连续创建,应该用static特性。

    不用宏的原因:ID仅用于cell的创建函数中,这样可以保证别的地方无法访问,而宏主要用于公共调用。

    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
        
        static NSString *ID = @"A";
        
        //先试着从缓存池拿特定标识A的cell
        UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:ID];
        //判断有没有在缓存池内拿到数据,没有拿到标识为A的cell
        if (cell == nil) {
            cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:ID];
        }
        //设置数据
        Hero *hero = self.heros[indexPath.row];
        cell.textLabel.text = hero.name;
        cell.detailTextLabel.text = hero.intro;
        cell.imageView.image = [UIImage imageNamed:hero.icon];
        cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
        
        return cell;
        
    }
    用staitc修饰局部变量可以保证变量只分配一次存储空间,优化性能。

    Tip:TableView还有关于网络的性能优化,在以后学到以后再进行介绍。

    Tip:虽然离开屏幕的cell会自动销毁,也应该慎用alloc,内存频繁的创建和销毁是很消耗性能的。






  • 相关阅读:
    Discuz!X3.2 uc_server密码正确无法登录的解决方法
    手动添加uc应用及其 提示notelist表缺少appX字段的处理方法
    discuz 3 头像显示不成功
    用户名称修改的完美解决方法
    WEB服务器、应用程序服务器、HTTP服务器区别
    小议函数指针
    Difference Between objectForKey and valueForKey in NSDictionary
    valueforkey objectforkey区别,
    budle identifier,
    return,hiding 之前,
  • 原文地址:https://www.cnblogs.com/aiwz/p/6154236.html
Copyright © 2011-2022 走看看