iOS性能优化-内存优化

  • 一、为什么需要内存优化
  • 二、内存管理
  • 三、常见问题
  • 四、内存占用
  • 五、检测工具
  • 摘要

一、为什么需要内存优化

The easy answer is users have a better experience.
Not only will your app launch faster.
The system will perform better.
Your app will stay in memory longer.
Other apps will stay in memory longer.
Pretty much everything’s better.


二、内存管理

Objective-C语言本身是支持垃圾回收机制的,但有平台局限性,仅限于Mac桌面系统开发中,而在iPhone和iPad等苹果移动终端设备中是不支持垃圾回收机制的。在移动设备开发中的内存管理是采用MRC(Manual Reference Counting)以及iOS5以后的ARC(Automatic Reference Counting),本质都是RC引用计数,通过引用计数的方式来管理内存的分配与释放,从而防止内存泄漏。

内存泄漏(Memory Leak)是指程序中己动态分配的堆内存由于某种原因程序未释放或无法释放,造成系统内存的浪费,导致程序运行速度减慢甚至系统崩溃等严重后果。


三、常见问题

内存问题主要包括两个部分,一个是iOS中常见循环引用导致的内存泄露 ,另外就是大量数据加载及使用导致的内存警告。

1、mmap
虽然苹果并没有明确每个App在运行期间可以使用的内存最大值,但是有开发者进行了实验和统计,一般在占用系统内存超过20%的时候会有内存警告,而超过50%的时候,就很容易Crash了,所以内存使用率还是尽量要少,对于数据量比较大的应用,可以采用分步加载数据的方式,或者采用mmap方式。mmap 是使用逻辑内存对磁盘文件进行映射,中间只是进行映射没有任何拷贝操作,避免了写文件的数据拷贝。 操作内存就相当于在操作文件,避免了内核空间和用户空间的频繁切换。之前在开发输入法的时候 ,词库的加载也是使用mmap方式,可以有效降低App的内存占用率。

1>Cell的重用机制,包括UITableView、UICollectionView。

2、循环引用
循环引用是iOS开发中经常遇到的问题,尤其对于新手来说是个头疼的问题。循环引用对App有潜在的危害,会使内存消耗过高,性能变差和Crash等,iOS常见的内存主要以下三种情况:

1>Delegate
代理声明为weak是一个即好又安全的做法
@property (nonatomic, weak) id delegate;

2>NSTimer
使用类方法
使用weakProxy
使用GCD timer

3>Block

3、其他
1>NSNotification addObserver之后,在dealloc里面添加remove。
2>动画的repeat count无限大,而且也不主动停止动画,基本就等于无限循环。
3>forwardingTargetForSelector不能返回self。
4>UIGraphicsBeginImageContext之后调用UIGraphicsEndImageContext。
5>C语法,malloc之后调用free。
6>CoreFoundation
7>明确标注需要release的函数。
SecPKCS12Import、protocol_copyMethodDescriptionList等


四、内存占用


五、检测工具

1、Xcode Memory Debugger
2、Instruments
3、FBRetainCycleDetector
FBAlloca1onTracker
FBMemoryProfiler
4、MLeaksFinder


摘要

https://developer.apple.com/videos/play/wwdc2018/416/
https://juejin.im/post/5b23dafee51d4558e03cbf4f
https://blog.csdn.net/cordova/article/details/60958978
https://juejin.im/post/58ca0832a22b9d006418fe43

你可能感兴趣的:(性能优化)