iOS 性能优化之内存优化

        近四年没更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;

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值