iOS 性能优化之内存优化

2023-05-16

        近四年没更CSDN了,感慨万千。

        近年来在搞一款比较大的APP,项目中代码量100w+,里面使用的三方库、其他领域的二进制包比较多;以前这些三方、二进制都挤在同一个工程目录下,导致耦合性太大,项目看着特别杂乱臃肿,新人往往无从下手;两年前某大佬带队搞了一波解耦合,拆拆解解,如今的项目还是比较清晰明了的,按照模块划分出各种framework进行集成,便于管理。

        即使解耦合,项目中的100w+代码量还是实实在在的,性能优化、内存优化、IPA瘦身不得不提。

        基本上如果项目运行起来,手机发烫页面卡顿,不用想,肯定哪里又内存泄漏了;如今的手机性能,如果仅仅是开发人员技术问题导致内存消耗,那是到不了发烫的程度,从内存泄漏方面排查会比较实用。

        近年来招聘过程中,性能优化是必考问题,很多面试者都来自于小公司,涉及项目比较小,对于内存优化从来没有关注过,能说上来个一二三的,寥寥无几。

        性能与内存相辅相成,相爱相杀,今天我们先说说内存优化,关于IPA瘦身,下次再约。

目录

1、属性修饰词

2、UIImage的加载

3、UIImage改变颜色

4、避免缩放图片 

5、drawRect绘制

6、drawInContext

7、控件设置背景色

8、按需加载

9、三方的缓存处理


1、属性修饰词

        这个比较基础了,放在这里说感觉不太合适,但又不得不说,就提一句

atomic:原子属性,setter方法会加自旋锁,线程安全,避免了线程中抢夺资源引起的数据异常问题,但会导致资源消耗增大,降低效率,各位酌情使用

nonatomic:非原子属性,线程不安全,但效率高,开发中使用的也较多

2、UIImage的加载

        常见的就是UIImage的使用了,加载图片一般有两种方式:

通过名字加载::[UIImage imageNamed:],系统会对其进行缓存,并且不会释放,也无法手动清理; 通过路径加载:imageWithContentsOfFile或者initWithContentsOfFile。系统不会对其缓存,图片不在使用时,会被释放。

        对于使用频率低、图片比较大的资源,建议使用后者。

3、UIImage改变颜色

        还有一种情况,是给UIImage改变颜色,例如项目中设定主题颜色,一些小按钮标志也需要跟随主题颜色而变化。

        如果直接使用Core Graphics API更改UIImage颜色,那么内存中会额外生产一个图像,导致内存消耗。

        建议方案设置其tintColor,图片使用UIImageRenderingModeAlwaysTemplate的方式加载

view.tintColor = [UIColor redColor];
UIImage *image = [[UIImage imageNamed:imgName] imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate];

4、避免缩放图片 

        缩放必然需要计算,so~

5、drawRect绘制

        创建UIView后,如果使用drawRect对其重新绘制,那么内存消耗会超出你的想象,建议使用CAShapeLayer来代替drawRect

        CAShapeLayer基本可以完爆drawRect,渲染快,内存使用高效,边缘柔和不会有像素块,做柱状图的首选。`

6、drawInContext

        请使用CAShapeLayer

7、控件设置背景色

         避免使用透明view,不透明时,设置opaque属性为YES,

         控件如果有背景色,那么会增大内存消耗,

        对于有背景色的控件,尽量使用UIView+控件方式,来达到想要的目的。

        先到这里,小可爱不乖了,我去看看

8、按需加载

        避免同时加载过多资源,不需要立即显示的view,可稍后进行显示,考虑懒加载

9、三方的缓存处理

        SDWebImage的缓存机制,分为Disk和Memory两层,

        Memory这一层使得图片在被访问时可以免去文件IO过程,提高性能。默认情况下,Memory里存储的是解压后的图像数据,这个会导致巨大的内存开销。

        如果想要优化内存占用,可以选择存储压缩的图像数据,在应用启动的地方加如下代码

[SDImageCache sharedImageCache].config.shouldDecompressImages = NO;

[SDWebImageDownloader sharedDownloader].shouldDecompressImages = NO;

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

iOS 性能优化之内存优化 的相关文章

随机推荐

  • iOS如何在页面销毁时优雅的cancel网络请求

    大家都知道 xff0c 当一个网络请求发出去之后 xff0c 如果不管不顾 xff0c 有可能出现以下情况 xff1a 进入某个页面 xff0c 做了某种操作 xff08 退出页面 切换某个tab等等 xff09 导致之前的请求变成无用请求
  • glibc源码解读——malloc

    通过宏定义的展开 xff0c 找到malloc的函数地址 xff1a define C SYMBOL NAME name name define ASM LINE SEP void libc malloc size t bytes libc
  • 音视频开发入门基础知识(视频入门篇)

    RTSP实时音视频开发实战课程 xff1a lt RTSP实时音视频开发实战 gt 音视频开发入门基础知识 xff08 音频入门篇 xff09 目录 一 前言 二 视频采集和显示 三 视频常见的格式 四 RGB转YUV和YUV转RGB 五
  • Rust 类型、泛型和特征

    Rust 创建泛型 generic function rs fn give me lt T gt value T let 61 value fn main let a 61 34 generics 34 let b 61 1024 give
  • Vmware虚拟机硬盘扩容: Linux下虚拟机硬盘空间扩展及挂载配置

    都是自己使用过程中的小经验 xff0c 分享给大家 希望能互相帮助 进入正题 xff1a 大家是不是会遇到最初分配linux虚拟机硬盘后期不够用的情况 xff0c xff08 因为是我之前用友善之臂的虚拟机配ARM板学习 xff0c 只有2
  • 数据结构之冒泡排序

    文字描述 xff08 以升序为例 依次比较数组中相邻两个元素大小 xff0c 若a i gt a 43 1 xff0c 则交换两个元素 xff0c 两两都比较一遍称为一轮冒泡 xff0c 结果是让最大的元素排至最后重复以上步骤 xff0c
  • 十进制转八进制的方法

    include lt stdio h gt int main int n printf 34 请输入一个十进制的数 xff1a 34 scanf 34 d 34 amp n int i 61 0 int arr 100 while n 61
  • Nodejs之目录介绍及app.js说明

    随时随地阅读更多技术实战干货 xff0c 获取项目源码 学习资料 xff0c 请关注源代码社区公众号 ydmsq666 转自 xff1a https www cnblogs com Chen xy p 4466351 html nodejs
  • 源码学习笔记之Openssl

    目录 xff1a apps apps c apps h app rand c asn1pars c build info ca cert srl ca key pem ca req pem ca c CA pl in cert pem ci
  • Segmentation Fault错误原因总结

    一 什么是 Segmentation fault in Linux 所谓的段错误就是指访问的内存超过了系统所给这个程序的内存空间 通常这个值是由gdtr来保存的 他是一个48位的寄存器 其中的32位是保存由它指向的gdt表 后13位保存相应
  • 树莓派使用MobaXterm实现SSH和VNC

    树莓派使用MobaXterm实现SSH和VNC terminal推荐 xff1a MobaXterm 一 开机SSH无线连接 前提 xff1a 树莓派和PC在同一局域网下 xff0c 通过路由器获得树莓派ip 打开ssh boot目录新建文
  • 【Qt】QtCreator远程部署、调试程序

    1 添加远程设备 1 QtCreator 工具 gt 选项 gt 设备 gt 添加 2 设备设置向导选择 gt Generic Linux Device gt 开启向导 3 填写 标识配置的名称 随便写 设备IP 用户名 gt 下一步 4
  • Debian备份与还原

    备份 xff1a sudo su cd tar cvpzf backup tgz exclude 61 proc exclude 61 lost 43 found exclude 61 backup tgz exclude 61 mnt e
  • 微信开放平台-第三方平台开发配置及常见的问题

    目录 概述 参考文档 开源项目 amp 工具 第三方平台设置 问题及解决方法 概述 本实例 xff1a 第三方平台 43 微信公众号 xff08 服务号 xff09 微信开放平台 第三方平台 xff0c 为广大公众号和小程序提供运营服务和行
  • 【Python包管理系列1】python打包发布到PyPI全过程(入门版)

    文章目录 目的准备知识PyPIPyPAsetuptoolsbuildtwine 实战过程总结 目的 如果发布一个python包到pypi上 xff0c 共他人使用 xff0c 本文试图讲清楚 准备知识 PyPI 官网地址 xff1a htt
  • Web自动化测试(二)—— Selenium-API操作

    其他Web测试知识参考 xff1a Web自动化测试 目录 一 元素定位 1 如何进行元素定位 xff1f 2 浏览器开发者工具 2 1 如何使用浏览器开发者工具 二 元素定位方式 1 id定位 2 name定位 3 class name定
  • Java中字符串中子串的查找共有四种方法(indexof())

    亲测可用 xff0c 若有疑问请私信 indexOf 方法返回一个整数值 xff0c 指出 String 对象内子字符串的开始位置 如果没有找到子字符串 xff0c 则返回 1 如果 startindex 是负数 xff0c 则 start
  • 使用rust构建一个js引擎

    转载于 https my oschina net lilugirl2005 blog 3067895
  • Linux下使用acme.sh 配置https 免费证书

    acme sh 简单来说acme sh 实现了 acme 协议 可以从 let s encrypt 生成免费的证书 acme sh 有以下特点 xff1a 一个纯粹用Shell xff08 Unix shell xff09 语言编写的ACM
  • iOS 性能优化之内存优化

    近四年没更CSDN了 xff0c 感慨万千 近年来在搞一款比较大的APP xff0c 项目中代码量100w 43 xff0c 里面使用的三方库 其他领域的二进制包比较多 xff1b 以前这些三方 二进制都挤在同一个工程目录下 xff0c 导