返回

图随意 大图随意 iOS开发者,注意内存开销!

IOS

现在 App 的功能越来越多,对图像的处理也就越来越多,但是处理图像无疑是一件比较消耗资源的工作。

最近,我发现 APP 的直播间内存占用峰值非常高。经查,原因是因为聊天列表中,部分用户向列表中放了一张大图。这张图的像素数是一般设备的分辨率的四倍,一张图的内存开销就占用 2000+ KB,放 50 张图就占用 100000+ KB。

很显然,这是一个很严重的内存泄漏问题,只要用户一直放图,我们的内存就一直增加。并且,这张图片并不会随着页面销毁而销毁,而是一直会放在内存中,而我们的内存就永远增加下去,占据了大量手机内存。

当然,我们可以直接在 APP 中进行拦截,拦截大图,或者添加一些压缩处理等,但是这治标不治本。

在 Swift 中,image 的处理与显示是两个分离的,很清晰的两个方法:

//在图片上添加圆角和边框
func makeMaskImage(with image: Maskable, cornerRadius: CGFloat, borderWith: CGFloat, borderColor: UIColor){
    //增加圆角
    let output = image.applyMask(withRadius: cornerRadius)
    
    //加边框
    let borderdImage = image.maskedBorder(with: borderWith, and: borderColor)

    return input.alphaMask(with: maskImage)
}

所以,优化内存的时候,一般都从以下三个方面出发:

  1. 选择合适的大小和精度,不要使用不必要的数量级

  2. 设计数据结构的时候,也要更仔细的权衡字段的长度和类型,尽量节约使用

  3. 循环的时候,也是尽量小范围的循环,不要遍历整个表结构,用循环去完成一个没有必要的事情

  4. 内存优化的时候,尽量使用算法,现在时间是便宜的,空间是贵的,不要为了节省时间而浪费空间

我们都知道,任何设备的内存都是不大的,所以开发者在开发的时候,都尽量减少对手机内存的占用,针对一些需要处理的图像,可以做一些必要的压缩工作,优化处理方式,这样就可以大大减少内存的占用。

针对图像优化,我们可以从以下几个方面进行优化:

  1. 裁剪图片:因为很多时候,我们图片上其实还有不需要展示的部分,比如说聊天列表中的大图,我们可以裁剪出聊天列表的展示面积的图片,而不是全部图片都展示。

  2. 处理图片:我们可以使用一些算法来处理图片,比如:

  • 使用压缩算法压缩图片的内存

  • 降低图片的分辨率

  • 修改图片格式

  1. 合理使用内存:
  • 使用一些图片内存管理的 API,让我们的内存只保留部分图片

  • 不要使用一些大图作为背景图

总之,做好图片处理,规避一些图片展示上的误区,才能从根本上优化内存,减少对手机内存的占用。