一.概述

关于UITableView的基本使用, 其实十分简单.但是做App最重要的之一就是细致,技术方面要做到细致, 必须深入了解底层, 才能做出优化让程序跑得更快.那么这一系列文章从我实际项目中获得的经验和总结, 分享以下UITableView的一些原理和优化.我会先谈谈Apple对UITableView做的缓存池优化.接着再分享下, 我们如何在Apple的基础上还有哪些细致的地方, 方便可以进行基本优化.最后我们分享一下更复杂的优化, 接着介绍一下我写的第三方框架.

二.核心

UITableView的缓存池优化

在移动开发中,我们经常用到UITableView来展示数据, 而UITableView上的数据是由一个个的cell来进行展示的, 如果数据很多, 是不是就有很多的cell呢?想然不是,移动设备设计之初, 内存资源是十分有限的, 如果是有多少条数据, 就有多少个cell, 那么程序肯定会卡爆内存.所以Apple对UITableView做了第一层的优化, 也是十分重要的一层.就是缓存池优化.

其原理就是, 我们不是根据有几条数据就创建几个cell.而是基于这样两个机制 ,即首先创建出当前屏幕够用的cell, 当我们拖动屏幕, 要有新的cell出现的时候, 先去缓存池中去, 如果缓存池有, 就直接用, 后者再创建(取的逻辑).其次, 当cell滚出屏幕的时候, 并不是将cell这块内存释放掉, 而是将其放到缓存池中, 缓存起来(缓存的逻辑).

根据这个原理, 我们可以知道, 一般一个页面的cell总数 = celing(当前页面高度 / cell高度) + 1;

注意:

正是因为缓存机制, 所以我们拿到的cell, 可能是新创建的cell, 可能是缓存池的cell.所以每次拿到一个新的cell都要重新刷新数据.不然可能会造成数据错乱

缓存池的好处:

当cell数量很多时候节约了大量的内存资源. 节约了创建cell所需时间的开销.(所以缓存池即优化了内存开销, 也优化了时间开销).

UITableView系列(1)---Apple缓存池机制的更多相关文章

  1. 应用程序之UITableView的Plain用法和cell缓存池优化

    效果展示 过程分析 代码实现 cell缓存池优化 一.效果展示 二.过程分析 首先通过三步创建数据,展示数据 监听选中某一个cell时调用的方法 在cell中创建一个对话框 修改对话框中的值,并且重新 ...

  2. iOS之UITableView中的cell因为重用机制导致新的cell的数据出现重复或者错乱

      UITableView中的cell可以有很多,一般会通过重用cell来达到节省内存的目的:通过为每个cell指定一个重用标识符(reuseIdentifier),即指定了单元格的种类,当cell滚 ...

  3. 并发读写缓存实现机制(一):为什么ConcurrentHashMap可以这么快?

    大家都知道ConcurrentHashMap的并发读写速度很快,但为什么它会这么快?这主要归功于其内部数据结构和独特的hash运算以及分离锁的机制.做游戏性能很重要,为了提高数据的读写速度,方法之一就 ...

  4. JVM系列文章(四):类载入机制

    作为一个程序猿,只知道怎么用是远远不够的. 起码,你须要知道为什么能够这么用.即我们所谓底层的东西. 那究竟什么是底层呢?我认为这不能一概而论.以我如今的知识水平而言:对于Web开发人员,TCP/IP ...

  5. 拥抱.NET Core系列:MemoryCache 缓存选项

    在上一篇 "拥抱.NET Core系列:MemoryCache 缓存过期" 中我们详细的了解了缓存过期相关的内容,今天我们来介绍一下 MSCache 中的 Options,由此来介 ...

  6. 拥抱.NET Core系列:MemoryCache 缓存域

    在上一篇“<拥抱.NET Core系列:MemoryCache 缓存选项>”我们介绍了一些 MSCache 的机制,今天我们来介绍一下 MSCache 中的缓存域. MSCache项目 M ...

  7. 【安卓中的缓存策略系列】安卓缓存策略之综合应用ImageLoader实现照片墙的效果

    在前面的[安卓缓存策略系列]安卓缓存之内存缓存LruCache和[安卓缓存策略系列]安卓缓存策略之磁盘缓存DiskLruCache这两篇博客中已经将安卓中的缓存策略的理论知识进行过详细讲解,还没看过这 ...

  8. iOS开发:一个瀑布流的设计与实现(已实现缓存池功能,该功能使得瀑布流cell可以循环利用)

    一个瀑布流的实现有三种方式: 继承自UIScrollView,仿写UITableView的dataSource和delegate,创造一个缓存池用来实现循环利用cell 写多个UITableview( ...

  9. 拥抱.NET Core系列:MemoryCache 缓存域(转载)

    阅读目录 MSCache项目 缓存域 写在最后 在上一篇“<拥抱.NET Core系列:MemoryCache 缓存选项>”我们介绍了一些 MSCache 的机制,今天我们来介绍一下 MS ...

随机推荐

  1. hdu5017:补题系列之西安网络赛1011

    补题系列之西安网络赛1011 题目大意:给定一个椭球: 求它到原点的最短距离. 思路: 对于一个椭球的标准方程 x^2/a^2 + y^2/b^2 +z^2/c^2=1 来说,它到原点的最短距离即为m ...

  2. java实现矩阵连乘的动态规划

    package com.cjs.algorithm; public class DynamicPlan { /** * 此方法用来求解矩阵连乘的最小数乘次数 * * @param p * 传入的要连乘 ...

  3. 常用文件的文件头(附JAVA测试类)

    1. MIDI (mid),文件头:4D546864 2. JPEG (jpg),文件头:FFD8FF 3. PNG (png),文件头:89504E47 4. GIF (gif),文件头:47494 ...

  4. Android开发(20)--RadioGroup的使用

    RadioGroup 有时候比較实用.主要特征是给用户提供多选一机制. MainActivity.java package com.example.lesson16_radio; import and ...

  5. [Regular Expressions] Find Plain Text Patterns

    The simplest use of Regular Expressions is to find a plain text pattern. In this lesson we'll look a ...

  6. android sqlite数据库封装 实现crud

    android常用的数据保存方式有文件.sharepreferences.数据库.网络.contentprovider集中方式. 文件存储方式,经常使用在缓存整个页面数据,比如电子书内容.html数据 ...

  7. oracle监听服务开启

    输入命令netca即可开启oracle的监听服务 弹出对话框 选择监听服务配置,单击下一步 选择增加监听,单击下一步 监听的名字,默认即可,下一步 监听链接的协议,默认TCP协议即可,下一步 监听默认 ...

  8. Javascript基础引用类型之Object

    虽然说ECMAScript也是一门对象语言,但是它和其他面向对象语言还是有区别的,它不具有类和接口等基本结构.所以在ECMAScript中一般说类指的是引用类型.创建Object实例的方式有两种: 第 ...

  9. T4文本模板

    <#...#> 可以包含语句 <#=...#>  用于表达式,提供“输出”操作 <#+ ...> 使用类功能控制块向文本模板添加方法.属性.字段,必须作为文件中最后 ...

  10. iOS之断点下载,使用NSURLSession简单封装

    最近公司需要做个文件管理的功能模块,刚交到博主手上时,头都大了.因为没做过这方面的东西,只好咬牙加班,并请教某位大神,指点了一下,清楚研究方向,找了网上大量资料,最后实现简单的封装. 上代码:.h文件 ...