来自搜狗输入法的IOS性能优化建议

一、性能优化建议

1.懒加载

– 延迟加载

– 不需要的对象不立即初始化,需要用到时才初始化

– 重写对象的getter方法

2.尽量不阻塞主线程

– 同步 vs 异步

– 延迟调用

3.慎用Autolayout

– 简单、强大易用、可读性强

– updateConstraints调用时机

– 性能问题

4.慎用NSDateFormatter

来自搜狗输入法的IOS性能优化建议_第1张图片
8151395.png

• 输出结果:

– using NSDateFormatter costs 1.349986 milliseconds

– using local1me costs 0.090957 milliseconds

• 应减少对NSDateFormatter的调用,或用 localtime替代

5.慎用[NSString sizeWithAttributes:]

来自搜狗输入法的IOS性能优化建议_第2张图片
7344659.png

• 输出结果: – Text width 61.14 costs 17.042994 milliseconds
– Text width 60.00 costs 0.000000 milliseconds

• 减少字符串size的实时计算,或寻求替代方案

• 原则:技术调研要到位,分析和实践相结合


二、崩溃率

**• 崩溃日志收集 **

– Crash Reporter

– itunes Connect

– Bugly

– Crashly1cs

– 友盟等

**• 崩溃日志解析 **

– symbolicatcrash

– xcrun atos

– dwarfdump

• 按崩溃分布定优先级解决问题


三、内存优化建议

1、autoreleasepool的使用

来自搜狗输入法的IOS性能优化建议_第3张图片
autoreleasepool的使用 .png

2、避免循环引用

• 第三方内存泄露检测工具

– FBRetainCycleDetector
– FBAlloca1onTracker
– FBMemoryProfiler

• 防止使用block时出现引用闭环
– Reactive Cocoa中用到的一种宏:weakify、strongify
– 强弱引用转换,用于解决block与强引用self之间的循环

•引用问题

来自搜狗输入法的IOS性能优化建议_第4张图片
引用问题.png

3、读图方式优化

• [UIImage imageWithContentsOfFile:@""]
– 优点
​ • 不缓存图片到内存,内存可及时释放
​ • 适用于大图片,使用完就释放
– 缺点
​ • 无法读取Asset Catalog里的图片
​ • 读取图片需要完整文件名

• [UIImage imageNamed:@""]
– 优点
​ • 图片始终缓存,适用于某些需要在多个地方显示的图标,其对应
​ 的UIImage对象只会被创建一次,避免频繁的沙盒读写
– 缺点
​ • 缓存图片到内存,不能及时释放

4、选择正确的缓存策略

•基本原则
​ – 缓存需要的
​ – 缓存常用的
​ – 缓存计算或生成开销较大的
• 优化实践
​ – 非常用功能退出后,立即释放相关内存占用
​ – 有选择缓存图片资源、数据资源

5、降低内存占用峰值

• 目标
​ – 始终保持应用内存占用处于一个相对平稳的范围内
• 优化实践-通讯录信息联想内存优化

​ (1)、面临问题

​ – 手机通讯录规模庞大,在多次进行通讯录信息联想时,
​ 存在较大的内存峰值,容易引发内存问题

​ (2)、解决方法

    – CFArrayRef ABAddressBookCopyArrayOfAllPeople
    (ABAddressBookRef addressBook)  
    – CFArrayRef ABAddressBookCopyPeopleWithName
    (ABAddressBookRef addressBook,  CFStringRef name)       

PS:ios9之后出了全新的联系人相关框架——Contacts Framework,摒弃了之前AddressBookFramework的相关api的繁琐操作。有关Contacts Framework的资料可以参考Contacts Framework

以下是加载通讯录5000+条的优化前后对比

来自搜狗输入法的IOS性能优化建议_第5张图片
通讯录规模5000+.png

6、内存文件映射的使用

• 优点
​ – 内存文件映射对应external
​ – 不算应用程序占用的内存,能有效减少应用程序占用
​ 的内存,避免触及低内存阈值
• 缺点
​ – 性能消耗问题
​ – 映射文件的大小、个数需要考虑,两者权衡
• 使用文件映射
​ – NSData: + dataWithContentsOfFile:op1ons:error:;
​ – mmap、munmap、msync

7、FastImageCache的使用

​ – Path团队开发的一个开源库,用于提升图片的加载和渲
​ 染速度
​ – Mapped memory
​ – Uncompressed Image Data
​ – Byte Alignment
​ – GitHub下载:https://github.com/path/FastImageCache

以上优化建议参考MDCC2016搜狗输入法性能优化实践的演讲记录,资料共享,希望对大家有所帮助!MDCC2016演讲资料

你可能感兴趣的:(来自搜狗输入法的IOS性能优化建议)