iOS开发之UITableView优化问题

在iOS开发中tableView是最常用的控件之一,对tableView的熟悉使用是一名开发者必备的基础技能。本文主要针对tableView的优化方面提出一些建议方法,欢迎大家一块学习。

提示:如果你对tableView的层次结构还不够清晰,本博主向你推荐一篇文章,UITableView的结构方法解析
你会对tableView的层次结构和用法有详细的认识。


不得不说的tableView中cell复用原理

表格视图内部维护了一个cell的复用队列,每次需要新的cell时,可以先从队列中根据复用标识寻找是否有空闲的cell,若有则直接出列使用无需创建新的;若没有可用cell则需要创建新的。表格视图上的cell离开显示区域就会自动放入复用队列。

  1. 第一种方式

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@”cellId”];

  2. 第二种方式

    static NSString *ideitifier = @”cellId”;
    if (!cell) {
    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@”cellId”];
    }


接下来就介绍优化吧
1. 使用tableView的复用机制
作用:减少内存资源的消耗。
注意:cell被重用时,它内部绘制的内容并不会被自动清除,因此你可能需要调用setNeedsDisplayInRect:或setNeedsDisplay方法。
2. 提前预估高度
提前计算并缓存好高度(布局),因为heightForRowAtIndexPath:是调用最频繁的方法。
3. cell内部有图片
此时需要异步加载图片,防止卡顿(此时的SDWebImage的每个cell中都创建一个子线程吗?)但是内部开启的线程过多也会影响主线程的性能
解决办法:
3.1.)在scrollerView的代理方法中,didEndDragging,didEndDeceleratiing方法中,才开始异步加载,其它时刻不进行加载
3.2.在didEndDragging,didEndDeceleratiing方法中实现方法:获取屏幕上显示出来的cell的indexPath数组,然后通过遍历indexPath的数组,在数据源中,如果已经加载了,就不需要再异步加载,反之进行异步加载,然后再cellForRow方法中也进行一次判断:当self.tableView.dragging == NO && self.tableView.decelerating == NO 的时候执行异步加载图片的方法
4. 尽量少用addView给Cell动态添加View
可以初始化时就添加,相对于一些固定的视图在初始化时就布局好,学会用hidden属性来控制是否显示。
5. 减少子视图的数目
当cell上面的子视图数量过多时,会影响滑动性能,当子视图太多的时候,对适当的视图进行绘制。
6. 使用不透明视图
不透明的视图可以极大地提高渲染的速度。因此如非必要,可以将table cell及其子视图的opaque属性设为YES(默认值)。
7. 预渲染图像和离屏渲染
你会发现即使做到了上述几点,当新的图像出现时,仍然会有短暂的停顿现象。解决的办法就是预渲染图像,在bitmap context里先将其画一遍,导出成UIImage对象,然后再绘制到屏幕,详细做法可见《利用预渲染加速iOS设备的图像显示》
离屏渲染就是在tableView中展示多张需要切圆形的图片,此时不要使用setCornerRadius的方法,这样耗损性能,用Core Graphics绘制圆角,然后返回图片,在SDWebImage处理我的分类返回的图片,并进行缓存。
8. UIImage:本地图片加载方式本地图片加载常用方法有两种:
1). [UIImage imageNamed:@”xx.png”] 图片多次使用时使用,需要使用此方式加入缓存。
2). [[UIImage alloc] initWithContentsOfFile :@”xx.png”] 图片不常使用时,不使用缓存。
9. 避免对象创建时过多消耗资源
例如:日期处理,将保持日期对象全局唯一。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值