当前位置: 首页 > news >正文

iOS高级开发工程师面试——关于优化

iOS高级开发工程师面试——关于优化

  • 一、TableView 有什么好的性能优化方案?
  • 二、界面卡顿和检测你都是怎么处理?
  • 三、谈谈你对离屏渲染的理解?
  • 四、如何降低APP包的大小?
  • 五、日常如何检查内存泄露?
  • 六、APP启动时间应从哪些方面优化?

一、TableView 有什么好的性能优化方案?

  1. Tableview 懒加载、Cell 复用
  2. 高度缓存(因为 heightForRowAtIndexPath: 是调用最频繁的方法)
  • 当 cell 的行高固定时,使用固定行高 self.tableView.rowHeight = xxx;
  • 当 cell 的行高是不固定时,根据内容进行计算后缓存起来使用。第一次肯定会计算,后续使用缓存时就避免了多次计算;高度的计算方法通常写在自定义的cell中,调用时,既可以在设置
    cell 高的代理方法中使用,也可以自定义的 model 中使用(且使用时,使用get方法处理)。
  1. 数据处理
  • 使用正确的数据结构来存储数据;
  • 数据尽量采用局部的 section,或 cellRow 的刷新,避免 reloadData;
  • 大量数据操作时,使用异步子线程处理,避免主线程中直接操作;
  • 缓存请求结果。
  1. 异步加载图片:SDWebImage 的使用
  • 使用异步子线程处理,然后再返回主线程操作;

  • 图片缓存处理,避免多次处理操作;

  • 图片圆角处理时,设置 layer 的 shouldRasterize (英[ˈræstəraɪz])属性为 YES,可以将负载转移给 CPU。

  1. 按需加载内容
  • 滑动操作时,只显示目标范围内的 Cell 内容,显示过的超出目标范围内之后则进行清除;

  • 滑动过程中,不加载显示图片,停止时才加载显示图片。

  1. 视图层面

(1)减少 subviews 的数量,自定义的子视图可以整合在形成一个整体的就整合成一个整体的子视图;
(2)使用 drawRect 进行绘制(即将 GPU 的部分渲染转接给 CPU ),或 CALayer 进行文本或图片的绘制。在实现 drawRect方法的时候注意减少多余的绘制操作,它的参数 rect 就是我们需要绘制的区域,在 rect范围之外的区域我们不需要进行绘制,否则会消耗相当大的资源;
(3)异步绘制,且设置属性self.layer.drawsAsynchronously = YES;(遇到复杂界面,遇到性能瓶颈时,可能就是突破口);
(4)定义一种(尽量少)类型的 Cell 及善用 hidden 隐藏(显示) subviews;
(5)尽量使所有的 view 的opaque 属性为 YES,包括 cell 自身,以提高视图渲染速度(避免无用的 alpha 通道合成,降低 GPU 负载);
(6)避免渐变,图片缩放的操作;
(7)使用 shadowPath 来画阴影;
(8)尽量不使用cellForRowAtIndexPath: ,如果你需要用到它,只用一次然后缓存结果;
(9)cellForRowAtIndexPath不要做耗时操作:如不读取文件 / 写入文件;尽量少用 addView 给 Cell 动态添加 View,可以初始化时就添加,然后通过hide 来控制是否显示;
(10)我们在 Cell上添加系统控件的时候,实际上系统都会调用底层的接口进行绘制,大量添加控件时,会消耗很大的资源并且也会影响渲染的性能。当使用默认UITableViewCell 并且在它的 ContentView 上面添加控件时会相当消耗性能。所以目前最佳的方法还是继承UITableViewCell,并重写 drawRect 方法;
(11)当我们需要圆角效果时,可以使用一张中间透明图片蒙上去使用ShadowPath 指定 layer 阴影效果路径使用异步进行 layer 渲染(Facebook 开源的异步绘制框AsyncDisplayKit )设置 layer 的 opaque 值为 YES减少复杂图层合成尽量使用不包含透明(alpha)通道的图片资源尽量设置 layer的大小值为整形值直接让美工把图片切成圆角进行显示,这是效率最高的一种方案很多情况下用户上传图片进行显示,可以让服务端处理圆角使用代码手动生成圆角 Image 设置到要显示的 View 上,利用 UIBezierPath ( CoreGraphics 框架)画出来圆角图片。

二、界面卡顿和检测你都是怎么处理?

卡顿原因: 在一个VSync内GPU和CPU的协作,未能将渲染任务完成放入到帧缓冲区,视频控制器去缓冲区拿数据的时候是空的,所以卡帧。

卡顿优化:

  1. 图片等大文件IO缓存

  2. 耗时操作放入子线程

  3. 提高代码执行效率(JSON to Model的方案,锁的使用等,减少循环,UI布局frame子线程预计算)

  4. UI减少全局刷新,尽量使用局部刷新

http://www.dtcms.com/a/276826.html

相关文章:

  • Datawhale 2025 AI夏令营 MCP Server Task2
  • 一文认识并学会c++模板(初阶)
  • 基于无人机 RTK 和 yolov8 的目标定位算法
  • ESP32使用freertos更新lvgl控件内容
  • 【时间之外】尘封的智能套件复活记
  • 数据结构与算法之美:跳表
  • 【CMake】CMake构建项目入门
  • 数据标注:AI时代的黄金矿场如何规避法律暗礁
  • C语言习题三
  • HCIA--- OSPF动态路由实验
  • 基于springboot+Vue的二手物品交易的设计与实现(免费分享)
  • 《棒垒球知识科普》技巧赛规则·棒球1号位
  • houdini 用 vellum 制作一个最简单的布料
  • Windows环境下JS计时器精度差异揭秘
  • PyQt5布局管理:QHBoxLayout和QVBoxLayout详解
  • cmd命令之for循环
  • 深入理解-ConcurrentHashMap:JDK-1-7-与-1-8-的演进与实现原理
  • 管理端口: 一个简单的锤子架子
  • JavaSE常用类
  • 《Spring 中上下文传递的那些事儿》Part 11:上下文传递最佳实践总结与架构演进方向
  • Linux反弹shell的几种方式
  • 【leetcode】709. 转换成小写字母
  • 直播录屏技术揭秘:以抖音直播录屏为例
  • 【嘉立创】四层板设计
  • 如何搭建一个高质量的开放接口平台
  • 数据结构与算法之美:线索二叉树
  • 【Scratch】从入门到放弃(四):指令大全-九大类之事件、控制、侦测
  • 解释全连接层的“参数数量”和“计算过程”,保证像看动画片一样直观~
  • c++反射实现
  • # 打开【设备和打印机】菜单时显示成新式【打印机和扫描仪】菜单,怎么才能显示传统带打印机图标菜单?