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.pswp.cn/bicheng/88836.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/88836.shtml
英文地址,请注明出处:http://en.pswp.cn/bicheng/88836.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

线性基学习笔记

我们称一个线性空间 V V V 的一个极大线性无关集为这个线性空间的线性基,简称基。 异或线性基 在异或空间下,我们定义如下内容。 异或和 设 S S

ESP-Timer入门(基于ESP-IDF-5.4)

主要参考资料: ESP 定时器(高分辨率定时器): https://docs.espressif.com/projects/esp-idf/zh_CN/stable/esp32s3/api-reference/system/esp_timer.html 目录ESP-Timer与FreeRTOS TimerAPI 使用1.创建定时器2.启动定时器3.管理定时器4.时间管…

014_批处理与大规模任务

批处理与大规模任务 目录 批处理概述核心优势技术规格API使用管理和监控应用场景最佳实践 批处理概述 什么是批处理 批处理(Batch Processing)是一种异步处理大量Claude API请求的方法,允许您一次性提交多个消息请求,系统将在…

Python淘宝拍立淘按图搜索API接口,json数据示例参考

淘宝拍立淘按图搜索API接口示例淘宝的拍立淘(图片搜索)功能通常是通过淘宝开放平台提供的API实现的。以下是一个模拟的JSON数据示例和接口调用参考:模拟API请求示例import requestsimport base64# 示例图片路径image_path "example.jpg"# 读取图片并编码…

静默的田野革命—人工智能重构农业生态的技术风暴与文明悖论

一、饥饿困局的数字突围当全球粮食损失率高达30%(约13亿吨)与8亿人营养不良并存,当农药滥用导致传粉昆虫种群崩溃与地下水资源枯竭,传统农业的生态死结日益收紧。这场危机的核心是生物复杂性对工业化农业的报复:小麦基…

【大模型推理论文阅读】 Thinking Tokens are Information Peaks in LLM Reasoning

Demystifying Reasoning Dynamics with Mutual Information:Thinking Tokens are Information Peaks in LLM Reasoning 摘要 大语言推理模型(LRM)在复杂问题解决方面展现出了令人瞩目的能力,但其内部推理机制仍未得到充分理解。…

【TCP/IP】14. 远程登录协议

14. 远程登录协议14. 远程登录协议14.1 基本概念14.2 Telnet 命令14.3 Telnet 选项及协商14.4 Telnet 子选项协商14.5 Telnet 操作模式本章要点14. 远程登录协议 14.1 基本概念 Telnet 协议是 TCP/IP 协议族的重要成员,核心功能是实现本地计算机对远程主机的终端仿…

Flink1.20.1集成Paimon遇到的问题

flinkcdc mysql 到paimon 1:Caused by: java.lang.ClassNotFoundException: org.apache.kafka.connect.data.Schema 可以参考这个文章 明确指出了flink-connector-mysql-cdc-3.4.0.jar存在这个包,但是flink-sql-connector-mysql-cdc-3.4.0.jar中没有这个…

C++高频知识点(十)

文章目录46. 智能指针是什么?怎么使用?1. std::unique_ptr2. std::shared_ptr3. std::weak_ptr47. 什么是野指针?1. 使用已释放的指针2. 未初始化的指针3. 指针超出作用域如何避免野指针1. 立即将指针置空2. 初始化指针3. 使用智能指针4. 避免返回局部变…

c#中Random类、DateTime类、String类

C# 中 Random 类分析Random 类用于生成伪随机数,位于 System 命名空间。它的核心机制是基于一个种子值 (seed),通过算法生成看似随机的数列。相同种子会生成相同的随机数序列,这在需要可重现的随机场景中很有用。核心特点种子与随机性默认构造…

Vscode 下载远程服务器失败解决方法

今天在使用 vscode 连接远程主机时,突然再次遇到这个问题,按照以往的经验,直接按照这个博主的文章其实就能解决,但是不知道为什么,今天这个方案失效了,然后卸载安装服务器和本机的vscode什么的也都试过了&a…

【算法】贪心算法:柠檬水找零C++

文章目录前言题目解析算法原理代码示例策略证明前言 题目的链接,大家可以先试着去做一下再来看一下思路。 860. 柠檬水找零 - 力扣(LeetCode) 题目解析 首先我们要认真去拿到题目中的关键有用信息。 认真的去阅读题目给的示例,然…

27.【.NET8 实战--孢子记账--从单体到微服务--转向微服务】--单体转微服务--币种服务(一)

从本篇文章开始,我们将用两篇内容详细介绍币种服务的实现。币种服务本身结构较为简单,核心功能包括内置币种的初始化、币种汇率的同步以及汇率的查询。在本篇中,我们将重点讲解如何实现内置币种的初始化功能,为后续的服务打下基础…

(2)从零开发 Chrome 插件:实现 API 登录与本地存储功能

从零开发 Chrome 插件:实现 API 登录与本地存储功能 Chrome 插件作为浏览器功能的重要扩展,能极大提升用户的工作效率。本文将以一个「登录功能插件」为例,带你从零构建一个可调用 API 验证身份、并将用户信息存储在本地的 Chrome 插件。 基…

Flink时间窗口详解

一、引言在大数据流处理的领域中,Flink 的时间窗口是一项极为关键的技术,想象一下,你要统计一个电商网站每小时的订单数量。由于订单数据是持续不断产生的,这就形成了一个无界数据流。如果没有时间窗口的概念,你就需要…

宽带接入,网线插入电脑的经验

现在一般家里安装移动宽带,都会提供四个千兆接口的光猫路由器,但是要注意了 首先网线的两端看起来一样,实际上并不是,如果发现连接不成功,那么就要换一头重新尝试, 一般像说什么自动DHCP啊,因为…

crmeb多门店对接拉卡拉支付小程序聚合收银台集成全流程详解

一、商户注册与配置​​注册支付平台账号​​:在拉卡拉开放平台注册商户账号(私信联系注册)​​创建应用​​:获取小程序应用ID(AppID)​​配置支付参数​​:商户号(MID)终端号(TID)API密钥支付回调地址二、配置拉卡拉…

C#将树图节点展示到NetronLight图表中

之前写过NetronLight开源框架 C#使用开源框架NetronLight绘制流程图-CSDN博客 我们这里将TreeView树图的节点内容展示到NetronLight图表中,按照树的层次【深度Level】展示 新建窗体应用程序ShowTreeNodeToDiagram,将默认的Form1重命名为FormShowNode&…

精密模具大深径比微孔尺寸检测方案 —— 激光频率梳 3D 轮廓检测

引言精密模具中大深径比微孔(深径比>20:1,孔径<1mm)的尺寸精度直接影响注塑件、电子元件等产品的成型质量。此类微孔具有孔径小、深度大、表面质量要求高(Ra≤0.1μm)等特点,传统检测…

defer学习指南

一、源头:早期管理资源(如数据库连接、锁、文件句柄、网络连接)和状态清理异常麻烦。 必须在每个可能的返回点(return、err、panic)手动重复清理代码,极易遗漏且打断主要逻辑思路!像Java语言虽然…