内存分析
静态分析 Analyze
动态分析 Instruments
- 可以查看内存分配情况Allocations
- 可以查看某个操作后内存暴涨的情况。
- 可以查看是否内存泄漏 Leaks。
在BaseViewController的dealloc方法里打印一下,看看离开某个页面后控制器是否被销毁了。
内存优化
- cell复用,header、footer复用。
- 尽量把view设置不透明。
- 减少视图的层级。
- 加载图片的方式
- UIImage imageNamed: ImageAssets 用于多个地方重复使用,加载时会缓存在内存里。
- UIImage imageWithContentsOfFile 一般用在图片数据很大,一般不需要多次使用的情况。不会长期存在内存里。
- 不要阻塞主线程。耗时操作放在后台进行,如网络请求,数据库读写。dispatch_get_main_queue dispatch_get_global_queue
- 图片大小最好和UIImageView的大小相同。在运行中缩放图片是很耗费资源的。如果图片是网络获取的,可以在下载完成后,在后台线程缩放一次,然后在赋值。
- 懒加载。
- 缓存,缓存图片SDWebImage,缓存行高。NSCache系统回收内存的时候它会自动删掉它的内容。
- NSDateFormatter和NSCalendar初始化很慢,可以把它作为属性或者成员变量,只在第一次用到的时候初始化一次。
- 避免反复处理数据。比如tableView最好用array。
- 使用Shadow Path来画阴影
- 优化TableView
- 正确复用cell
- 视图尽量不透明
- 避免渐变,图片缩放。
- 缓存行高
- 异步加载,缓存请求结果
- 使用shadowPath来画阴影
- 减少视图层级
- 使用正确的数据结构来存储数据,减少数据处理
- 使用rowHeight sectionHeaderHeight sectionFooterHeight来设定固定的高,不要用delegate
- 使用正确的数据存储
NSUserDefaults适合小数据。
plist 每次会读取整个文件到内存里。
NSCoding对象归档 也会读取整个文件到内存。
大的数据存储用SQLite或Core Data。 - for循环里创建对象耗内存时用Autorelease Pool
网友评论