当前位置: 首页 > 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.lryc.cn/news/586940.html

相关文章:

  • DMDIS文件到数据库
  • 基于springboot的大学公文收发管理系统
  • 求解线性规划模型最优解
  • 跨域中间件通俗理解
  • 【QT】使用QSS进行界面美化
  • 005_提示工程与工具使用
  • 用Python实现一个Windows计算器练习
  • 011_视觉能力与图像处理
  • sklearn study notes[1]
  • Linux内核高效之道:Slab分配器与task_struct缓存管理
  • 基于Leaflet调用天地图在线API的多层级地名检索实战
  • Matlab批量转换1km降水数据为tiff格式
  • Java性能优化权威指南-JVM概述和监控调优
  • [特殊字符] Python自动化办公 | 3步实现Excel数据清洗与可视化,效率提升300%
  • 技术实现、行业变革及可视化呈现角度,系统性解析AI技术(特别是模型训练平台)
  • C++每日刷题day2025.7.13
  • 查看ubuntu磁盘占用方法
  • 日记-生活随想
  • 单例模式:确保全局唯一实例
  • 芯片相关必备
  • 第三章-提示词-解锁Prompt提示词工程核销逻辑,开启高效AI交互(10/36)
  • 如何成为 PostgreSQL 中级专家
  • 图形处理算法分类、应用场景及技术解析
  • Web应用性能优化之数据库查询实战指南
  • C/C++数据结构之多维数组
  • MySQL实操:将Word表格数据导入MySQL表
  • 导入 SciPy 的 io 模块
  • 基于Springboot+UniApp+Ai实现模拟面试小工具三:后端项目基础框架搭建上
  • 在人工智能自动化编程时代:AI驱动开发和传统软件开发的分析对比
  • ECU(电子控制单元)是什么?