面试中常常会问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的创建函数中,这样可以保证别的地方无法访问,而宏主要用于公共调用。

  1. - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
  2.  
  3. static NSString *ID = @"A";
  4.  
  5. //先试着从缓存池拿特定标识A的cell
  6. UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:ID];
  7. //判断有没有在缓存池内拿到数据,没有拿到标识为A的cell
  8. if (cell == nil) {
  9. cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:ID];
  10. }
  11. //设置数据
  12. Hero *hero = self.heros[indexPath.row];
  13. cell.textLabel.text = hero.name;
  14. cell.detailTextLabel.text = hero.intro;
  15. cell.imageView.image = [UIImage imageNamed:hero.icon];
  16. cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
  17.  
  18. return cell;
  19.  
  20. }

用staitc修饰局部变量可以保证变量只分配一次存储空间,优化性能。

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

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

(十七)TableView的本地性能优化的更多相关文章

  1. IOS tableView的性能优化(缓存池)

    使用缓存池(标识类型) 1.通过 一个 标识 去 缓存池 中寻找可循环得用的cell 2.如果缓存池找不到可循环得用的cell:创建一个新的cell(给cell贴个标识) 3.给cell设置新的数据 ...

  2. 复杂TableView在iOS上的性能优化

    声明:本文翻译自<iOS performance optimization>,原文作者 Khang Vo.翻译本文纯属为了技术交流的目的,并不具有任何的商业性质,也不得利用本文内容进行商业 ...

  3. TableView的性能优化

    现在市场上的iOS应用程序界面中使用最多的UI控件是什么? 答案肯定是UITableView,几乎每一款App都有很多的界面是由UITableView实现的,所以为了做出一款优秀的App,让用户有更好 ...

  4. Spark性能优化(2)——广播变量、本地缓存目录、RDD操作、数据倾斜

    广播变量 背景 一般Task大小超过10K时(Spark官方建议是20K),需要考虑使用广播变量进行优化.大表小表Join,小表使用广播的方式,减少Join操作. 参考:Spark广播变量与累加器 L ...

  5. iOS之tableView性能优化/tableView滑动卡顿?

    本文围绕以下几点展开tableView性能优化的论述? 1.UITableViewCell重用机制? 2.tableView滑动为什么会卡顿? 3.优化方法? 4.总结 1.UITableViewCe ...

  6. Linux性能优化实战学习笔记:第五十七讲

    一.上节回顾 上一节,我带你一起梳理了常见的性能优化思路,先简单回顾一下.我们可以从系统和应用程序两个角度,来进行性能优化. 从系统的角度来说,主要是对 CPU.内存.网络.磁盘 I/O 以及内核软件 ...

  7. JS性能优化笔记搜索整理

    通过网上查找资料了解关于性能优化方面的内容,现简单整理,仅供大家在优化的过程中参考使用,如有什么问题请及时提出,再做出相应的补充修改. 一. 让代码简洁:一些简略的表达方式也会产生很好的优化 eg:x ...

  8. [JAVA] java程序性能优化

    一.避免在循环条件中使用复杂表达式 在不做编译优化的情况下,在循环中,循环条件会被反复计算,如果不使用复杂表达式,而使循环条件值不变的话,程序将会运行的更快. 例子: import java.util ...

  9. IOS 性能优化的建议和技巧

    IOS 性能优化的建议和技巧 本文来自iOS Tutorial Team 的 Marcelo Fabri,他是Movile的一名 iOS 程序员.这是他的个人网站:http://www.marcelo ...

随机推荐

  1. LOG4J日志级别详解

    日志记录器(Logger)是日志处理的核心组件. org.apache.log4j.Level类提供以下级别,但也可以通过Level类的子类自定义级别. Level 描述 ALL 各级包括自定义级别 ...

  2. Swift中方法(method)所谓的lazy绑定简介

    我们知道在ruby之类的动态语言中对象方法可以先从类中预先抽取,然后再应用到某个具体对象上.这称为无绑定的method对象,也可以叫做lazy绑定. 下面举个例子: irb(main):004:0&g ...

  3. 微信小程序基本组件概述

    为了更好的理解微信小程序,本文90%文字描述来源于官网的介绍.官网原链接https://mp.weixin.qq.com/debug/wxadoc/dev/component/?t=20161222 ...

  4. Apache shiro集群实现 (三)shiro身份认证(Shiro Authentication)

    Apache shiro集群实现 (一) shiro入门介绍 Apache shiro集群实现 (二) shiro 的INI配置 Apache shiro集群实现 (三)shiro身份认证(Shiro ...

  5. [线程]Thead 中传参数RuntimeError: thread.__init__() not called

    在写一个多线程类的时候调用报错 RuntimeError: thread.__init__() not called class NotifyTread(threading.Thread): def ...

  6. [django1.6]跑批任务错误(2006, 'MySQL server has gone away')

    有个django的定时任务的需求,调用django的orm来对数据库进行数据处理.  在交互环境下直接启动pyhton脚本没有问题,放在定时任务中时候,总是出现 (2006, 'MySQL serve ...

  7. Servlet规范总结

    Servlet接口 Servlet规范的核心接口即是Servlet接口,它是所有Servlet类必须实现的接口,在Java Servelt API中已经提供了两个抽象类方便开发者实现Servlet类, ...

  8. Java学习之控制跳转语句

    控制跳转语句 控制跳转语句: (1)break:中断的意思 A:用在循环和switch语句中,离开此应用场景无意义. B:作用 a:跳出单层循环 b:跳出多层循环,需要标签语句的配合 (2)conti ...

  9. GDAL库扩展Landsat系列MTL文件格式支持

    Landsat系列卫星提供的数据,一般都是每个波段一个tif文件,然后外加一个MTL.txt的元数据文件,使用gdal可以直接打开每个波段的tif文件,但是有时候想在打开tif数据的同时能够自动读取M ...

  10. C语言与java语言中数据类型的差别总结

    在学习java的时候,看到char ch =  '男' ; 我就觉得很奇怪,char类型不是占用一个字节吗?为什么定义成一个汉字被说成是一个字符了? 原来,在C语言中,char在32位操作系统下占用1 ...