目录

一、包体积优化

二、内存优化

三、流畅性优化

四、启动优化

五、耗电优化


一、包体积优化

1、图片:

本地图片尽可能改为从网络下载。

本地图片可以无损压缩减小图片大小。

使用Assets.xcassets来管理图片。

使用阿里云的iconfont加载图片。

2、合并功能重复的类库,删除不必要的文件和第三方库

3、清除类里面不用的代码

二、内存优化

1、重用问题:如UITableViewCells、UITableViewHeaderFooterViews等设置正确的reuseIdentifier,充分重用;

2、尽量把view设置为不透明(alpha最好不要是0):可设置opque为NO,图层的半透明取决于图片和其本身合成的图层为结果,可提高性能;

3、不要使用太复杂的XIB/Storyboard:不仅后期维护困难,而且比纯代码耗能太多。

4、尽量使用frame布局,不要使用autolayout

5、选择正确的数据结构,避免反复处理数据:减少接口调用次数。选择对业务场景最合适的数组结构,来极少数据操作。

6、gzip/zip压缩:当从服务端下载相关附件时,可以通过gzip/zip压缩后再下载,使得内存更小,下载速度也更快。

7、延迟加载:对象懒加载。比如,网络请求失败时显示的提示界面,可能一直都不会使用到,因此应该使用延迟加载。

8、数据缓存:

对于cell的行高要缓存起来,使得reload数据时,效率也极高。

对于一些网络数据不需要每次都请求的,应该缓存起来,

可以写入数据库,也可以通过plist文件存储。

9、处理内存警告:不需要的对象及时释放

10、重用大开销对象:一些objects的初始化很慢,比如NSDateFormatter和NSCalendar,但又不可避免地需要使用它们。通常是作为属性存储起来,防止反复创建。

11、使用Autorelease Pool:在某些循环创建临时变量处理数据时,自动释放池以保证能及时释放内存;

12、使用instruments等工具排查内存泄漏,减少或避免泄漏

三、流畅性优化

除了以上,

13、线程优化,耗时操作放到子线程:例如,子线程请求数据,主线程刷新UI

14、runloop的mode,scrollview滑动时使用UITrackingRunLoopMode,其他情况使用kCFRunLoopDefaultMode

15、尽量减少视图数量和层次。

16、减少离屏渲染。

  • On-Screen Rendering:当前屏幕渲染,在当前用于显示的屏幕缓冲区进行渲染操作
  • Off-Screen Rendering:离屏渲染,在当前屏幕缓冲区以外新开辟一个缓冲区进行渲染操作

离屏渲染消耗性能的原因

  • 需要创建新的缓冲区
  • 离屏渲染的整个过程,需要多次切换上下文环境,先是从当前屏幕(On-Screen)切换到离屏(Off-Screen);等到离屏渲染结束以后,将离屏缓冲区的渲染结果显示到屏幕上,又需要将上下文环境从离屏切换到当前屏幕
  • +++哪些操作会触发离屏渲染?
  • 光栅化,layer.shouldRasterize = YES
  • 遮罩,layer.mask
  • 圆角,同时设置layer.masksToBounds = YES、layer.cornerRadius大于0
  • 考虑通过CoreGraphics绘制裁剪圆角,或者叫美工提供圆角图片
  • 阴影,layer.shadowXXX
  • 如果设置了layer.shadowPath就不会产生离屏渲染

四、启动优化

1、按需加载,不必要的接口后置请求,包含数据结构优化,前后端定义好需要哪些数据。

2、启动图压缩,减小大小

3、广告图空闲时间预加载,下次启动再展示

4、线程优化,耗时操作放在子线程

5、移除不需要的动态库(dylib)、类、库,可减少加载和编译时间

6、减少宏定义、静态变量

7、release版不要打印(NSLog)

五、耗电优化

程序的耗电主要在以下四个方面:

  • CPU 处理
  • 定位
  • 网络
  • 图像

优化的途径主要体现在以下几个方面:

  • 尽可能降低 CPU、GPU 的功耗。
  • 尽量少用 定时器。
  • 优化 I/O 操作。
    • 不要频繁写入小数据,而是积攒到一定数量再写入
    • 读写大量的数据可以使用 Dispatch_io ,GCD 内部已经做了优化。
    • 数据量比较大时,建议使用数据库
  • 网络方面的优化
    • 减少压缩网络数据 (XML -> JSON -> ProtoBuf),如果可能建议使用 ProtoBuf。
    • 如果请求的返回数据相同,可以使用 NSCache 进行缓存
    • 使用断点续传,避免因网络失败后要重新下载。
    • 网络不可用的时候,不尝试进行网络请求
    • 长时间的网络请求,要提供可以取消的操作
    • 采取批量传输。下载视频流的时候,尽量一大块一大块的进行下载,广告可以一次下载多个
  • 定位层面的优化
    • 如果只是需要快速确定用户位置,最好用 CLLocationManager 的 requestLocation 方法。定位完成后,会自动让定位硬件断电
    • 如果不是导航应用,尽量不要实时更新位置,定位完毕就关掉定位服务
    • 尽量降低定位精度,比如尽量不要使用精度最高的 kCLLocationAccuracyBest
    • 需要后台定位时,尽量设置 pausesLocationUpdatesAutomatically 为 YES,如果用户不太可能移动的时候系统会自动暂停位置更新
    • 尽量不要使用 startMonitoringSignificantLocationChanges,优先考虑 startMonitoringForRegion:
  • 硬件检测优化
    • 用户移动、摇晃、倾斜设备时,会产生动作(motion)事件,这些事件由加速度计、陀螺仪、磁力计等硬件检测。在不需要检测的场合,应该及时关闭这些硬件

iOS 性能优化(包体积优化、内存优化、流畅性优化、启动优化、耗电优化)相关推荐

  1. Unity - 性能优化 - 包体,内存 - 偏静态资源的优化

    文章目录 静态资源优化 - AssetPostprocessor Texture 压缩 Model 网格.动画 压缩 音频压缩 纹理的优化经验 尺寸 通道 发布出来的包资源再次分析 如何工具快速定位静 ...

  2. 【flutter】应用瘦身优化包体积

    资源优化 1.删除无用代码和资源文件 2.压缩图片 3.代码优化 4.混淆 5.分架构构建apk 1.删除无用代码和资源文件 每个应用在版本迭代的过程中都会产生很多弃用代码甚至模块,同时也会产生很多不 ...

  3. 【Tomcat】如何优化tomcat配置(从内存、并发、缓存4个方面)优化

    一.Tomcat内存优化 ** Tomcat内存优化主要是对 tomcat 启动参数优化,我们可以在 tomcat 的启动脚本 catalina.sh 中设置 java_OPTS 参数. JAVA_O ...

  4. 【Android】关于D8/R8那些事:Desugaring脱糖、APK包体积优化等

    Desugaring脱糖? 不同的Android版本支持的Jvm版本不同,当使用当前Abndroid版本不支持的高版本jdk语法时,需要在编译期转换为其支持的低版本jdk语法,这个过程成为desuga ...

  5. 性能优化之三——包体积优化大战

    博客结构 1.优化意义 2.分析工具 1.APK Analys 2.重要参数诠释 3.编包流程 4.优化战法 1.常规战法 1.清理无用资源 1.Lint工具 2.开启shrinkResources去 ...

  6. iOS包体积优化-图片优化

    文中提到的优化措施,编写了python自动化脚本,适用于iOS项目. 地址:GitHub - dongzhixuanyuan/imagesOptimize: Optimize images to de ...

  7. vue性能优化之build后包体积太大(1)

    基于vue-cli3.0构建项目,npm引入多个第三方包.build之后,包体积太大导致首屏过长.----毫无体验感!!! 实践的项目喜欢捣鼓可以clone下来 只总结了亲测效果明显的几种方案,解决方 ...

  8. iOS性能优化-内存优化(1)

    1.iOS的内存管理机制 Objective-C语言本身是支持垃圾回收机制的,但有平台局限性,仅限于Mac桌面系统开发中. 而在iPhone和iPad等苹果移动终端设备中是不支持垃圾回收机制的.在移动 ...

  9. iOS 性能优化总结

    原文链接:https://github.com/skyming/iOS-Performance-Optimization 关于 iOS 性能优化梳理: 基本工具.业务优化.内存优化.卡顿优化.布局优化 ...

  10. 游戏性能优化技术干货分享——内存管理

    项目的性能优化主要围绕CPU.GPU和内存三大方面进行.接上期CPU优化专讲,我们本期和大家分享内存方面的优化心得. 无论是游戏还是VR应用,内存管理都是其研发阶段的重中之重. 然而,在我们测评过的大 ...

最新文章

  1. java压缩解压缩类实例[转]
  2. 了解 C# “.NET研究”4 中的 Dynamic 关键字
  3. 【UIKit】UIView基础学习
  4. 嵌入式Linux C笔试题积累(转)
  5. C语言程序设计教学探讨,C语言程序设计多媒体教学探讨
  6. 什么能在main()函数之前或之后执行
  7. 拓扑排序基础题——排序
  8. php泥浆护壁,谈一下静态泥浆护壁的湿式旋挖工法施工      常见质量方面问题处理...
  9. mysql 5.5.46_MySQL 5.5.46源码安装
  10. 数据中心201812-4
  11. H5如何实现唤起APP
  12. 结合模电分析电流源电路(简单晶体管电流源,Howland电流源,压控电流源)
  13. java中的各种平均数
  14. html+css+js(未完待续)
  15. springboot 发送短信
  16. iOS-检查版本更新
  17. 魔兽争霸 php文件,[War3]Fdf文件详解,简单的UI教程演示-by CarlosX
  18. Leetcode刷题面试题 16.14. 最佳直线
  19. html_label标签
  20. 双硬盘下安装win+linux关于开机引导的问题

热门文章

  1. mess组网 中继_Mesh中继模式,哪个联网比较好?
  2. cadence17.2安装教程
  3. 小度计算机笔记,开售告罄、口碑炸裂、高语音交互率的小度耳机全新升级语音笔记...
  4. Mybatis缓存实现原理
  5. WPS Excel表格安装宏插件
  6. MySQL数据库主从同步,一致性解决方案
  7. Javascript跨域和Ajax跨域解决方案总结
  8. html5手机摄像头相册批量,h5调用手机摄像头/相册(示例代码)
  9. 虚拟化: 物理CPU与VCPU的关系 || 内存上限说起 VMware内存分配初探
  10. C# 第五章『面向对象』◆第9节:抽象类和密封类