【UIKit】UITableView.05 性能优化

UITableView.05 性能优化:

【为何要性能优化】:TableView拖屏过程中,不断有对象"消失"在屏幕上,但是这样的对象还是存在的,当拖拉过多后,导致内存严重泄漏。

解决方法:仅提供有限的对象,拖拉过程中,只是将内存地址存放的内容进行改变。



【旧代码】

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *cell=[[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:nil];
    cell.textLabel.text=[NSString stringWithFormat:@"itcast-%d",indexPath.row];
    NSLog(@"--%p--%d",cell,indexPath.row);
    return cell;
 }

【旧代码测试】:
  如图片所示,view中每显示一个新的row,都会创建一个新的内存地址,所以,拖的多了,就会产生许多个对象,这样会严重影响性能。



【新代码】

#pragma mark 每当有一个cell进入视野范围内就会调用,返回当前这行显示的cell
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    // 0.用static修饰的局部变量,只会初始化一次< # # > 
    static NSString *ID = @"Cell";

    // 1.拿到一个标识先去缓存池中查找对应的Cell
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:ID];

    // 2.如果缓存池中没有,才需要传入一个标识创建新的Cell
    if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:ID];
    }

    // 3.覆盖数据
    cell.textLabel.text = [NSString stringWithFormat:@"fdsfdsf-%d", indexPath.row];

    return cell;
}

【新代码测试】:

  由测试图可以看出,新代码只产生12个对象,其余内容都使用原先的12个内存地址。

    运行步骤:1.第一次加载需要加载11行,首先查找[缓存池]中是否有这11行的对象,缓存池中没有。所以创建

         2.第二次,用户拖屏后,数据显示第12行,也是先去[缓存池]中寻找是否有这个对象,缓存池中没有,创建。

         3.第三次,用户拖屏后,数据显示到第12行,第一行的数据已经不显示再view上了,第一行就移动到[缓存池]。

           4.当用户拖屏,数据显示到第13行时候,缓存池中有对象,于是,就将这个对象移出,作为第13行内容,第2行移动到[缓存池]

         5.以此类推.
【如图】第0行和第12行的内存地址相同,很好的佐证了上面的理论依据。

【UIKit】UITableView.05 性能优化,布布扣,bubuko.com

时间: 2024-10-18 04:47:19

【UIKit】UITableView.05 性能优化的相关文章

UITableView的性能优化1

UITableView作为ios中使用最频繁的控件之一,其性能优化也是常常要面对的,尤其是当数据量偏大并且设备性能不足时.本文旨在总结tableview的几个性能优化tips,并且随着认识的深入,本文将持续更新,力求将tableview的优化做到极致! Let`s begin! 治病就要先知道病因,我们先来分析一下影响tableview滚动性能的因素有哪些: 1 2 3 1.cellForRowAtIndexPath方法中处理了过多业务 2.tableviewCell的subview层级太复杂,

UITableView的性能优化

UITableView作为ios中使用最频繁的控件之一,其性能优化也是常常要面对的,尤其是当数据量偏大并且设备性能不足时.本文旨在总结tableview的几个性能优化tips,并且随着认识的深入,本文将持续更新,力求将tableview的优化做到极致! Let`s begin! 治病就要先知道病因,我们先来分析一下影响tableview滚动性能的因素有哪些: 1 2 3 1.cellForRowAtIndexPath方法中处理了过多业务 2.tableviewCell的subview层级太复杂,

关于UITableView的性能优化(历上最全面的优化分析)

(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 这个代理方法的实现,在可见的页面是会重复绘制页面的,所以绝大部分人都会在这里做一些代码处理 比如: static NSString *CellIdentifier = @"LazyTableCell"; UITableViewCell *cell = [tableView dequeue

UITableView滚动性能优化

影响 UITableView 滚动的流畅性的原因 1.在代理方法中做了过多的计算占用了 UI 线程的时间 2.Cell里的图片吃GPU(在tableView:cellForRowAtIndexPath:中) 3.Cell 中 view 的组织复杂 关于第一点,首先要明白 tableview 的代理(这里指 datasource 和 delegate 的那套方法,下同)方法的调用顺序,和时机.对于一般的应用会有如下顺序: 1.向代理要 number Of Rows. 2.对于每行向代理要 heig

UITableView简单性能优化

iOS设备的内存有限,如果用UITableView显示成千上万条数据,就需要成千上万个UITableViewCell对象的话,那将会耗尽iOS设备的内存.要解决该问题,需要重用UITableViewCell对象 重用原理:当滚动列表时,部分UITableViewCell会移出窗口,UITableView会将窗口外的UITableViewCell放入一个对象池中,等待重用.当UITableView要求dataSource返回UITableViewCell时,dataSource会先查看这个对象池,

【IOS开发】UITableView的性能优化

一..重用cell 在数据源方法中,在可见的页面重复绘制 OC方法中 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath; SWIFT方法 override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITabl

UITableView的性能优化10个小技巧

通常你会发现一个图片类的app会在一个imageView上做下面这些事情: 1  下载图片(主要的内容图片+用户头像图片)2  更新时间戳3  展示评论4  计算动态的cell的高度 Tip#1 学习怎么提升速度 1.打开你的项目并点击Product>Profile 2.在那儿选择Custom 3.找到添加按钮并且添加工具:Allocations,Time,Profile,Leaks 4.观察你的应用,以及他的表现. Tip#2 避免阻塞主线程 在这个例子中你会看到第一个图片相关的方法在数据下载

iOS 程序性能优化

前言 转载自:http://www.samirchen.com/ios-performance-optimization/ 程序性能优化不应该是一件放在功能完成之后的事,对性能的概念应该从我们一开始写代码时就萦绕在我们脑子里.了解 iOS 程序性能优化的相关知识点,从一开始就把它们落实到代码中是一种好的习惯. 初级技巧 使用复用机制 在我们使用 UITableView 和 UICollectionView 时我们通常会遇到「复用 Cell」这个提法,所谓「复用 Cell」就是指当需要展示的数据条

iOS_UITableView性能优化那点事

UITableView在实际开发中使用频率实在是很高, 因此, UITableView的性能优化是必不可少的, 本文下面就略微总结一下UITableView性能优化那点事. 本文着重介绍具体方法, 原理的话在文章最后会给出一些链接, 有兴趣可以自行查看. 1. 关于数据绑定 很多新加入iOS的朋友喜欢把数据绑定写入在UITableView Data Source方法 - (UITableViewCell *)cellForRowAtIndexPath:(NSIndexPath *)indexPa