iOS Developer程序员

APP性能优化汇总

2017-05-15  本文已影响115人  _既白_

简介

随着IPhone手机市场的快速发展,苹果对 IOS APP的审核和要求也更加的苛刻。所以APP的性能是决定能否上架,能否给用户更好的用户体验的关键因素之一。性能优化主要包括启动速度、UI反馈与响应、列表的滚动流畅性、内存是否泄漏、图形动画、等方面。

TabViewCell性能分析

layer.shadow
layer.allowsGroupOpacity or layer.allowsEdgeAntialiasing
layer.shouldRasterize
layer.mask
layer.masksToBounds && layer.cornerRadius

所以在Cell中尽量避免给控件图层使用shadow(阴影)、shouldRasterize(光栅化)、layer.masksToBounds && layer.cornerRadius(设置圆角)等属性。

-(void)viewDidLoad {
[super viewDidLoad];
// 只在NSDefaultRunLoopMode下执行(刷新图片)
[self.myImageView performSelector:@selector(setImage:) withObject:[UIImage imageNamed:@""] afterDelay:ti inModes:@[NSDefaultRunLoopMode]];    
}

(3)本地图片加载:从Bunder中加载图片有两种方式,imageWithNameimageWithContentOfFileimageWithName加载图片的时候会缓存图片到内存,不适合加载太大的图片,不然对消耗大量的内存性能。imageWithContentOfFile仅加载图片不会缓存,适合加载大图片且不会被反复使用的图片,节省内存,提高性能。
(4)图片颜色格式、图片大小:如CoreAnimation上介绍

避免使用大量的XIB文件。

因为一个程序中XIB文件都是动态加载的,在编译的时候就会被全部加载到内存中。如果程序中使用了大量的XIB文件,不仅影响启动程序的速度,而且还占用了大量内存空间,用户的体验大大折扣。

做任何事都不要阻塞主线程

苹果将所有关于UI操作的内容都放在主线程(UI线程)中,原因是将所有的UI资源放在一个线程中,而且在主线程中任何属性的生命都是用非原子类型的。
(1)为了避免资源抢夺的危险;
(2)为了不用为主线程中的资源枷锁,因为加锁是非常浪费系统资源的。
(3)主线的优先级最好,放在主线程中的操作执行的更快,响应的更加灵敏,用户体验非常好。
(4)所以任何关于UI的操作都要放在主线中去操作。而无关UI的操作最好放到子线程中操作,比如上传、下载、网络请求、定时器等耗时操作。

尽量在ViewWillAppear方法中少写代码。

因为ViewWillAppear实在视图出现之前执行,如果在这个方法中执行了很多操作,会导致程序启动很慢,影响用户体验。

集合的选择和使用

NSSArray:是有序的一组值。用index查询快,但是插入和删除慢。
NSDictionary:是无序的,通过key存储的,所以通过Key查找很快。
Sets:无序的一组值,通过Value查找快,删除和插入块。
所以合理的选择数据封装格式,也更够提高软件性能。

延迟加载(懒加载)

懒加载的思想也是很重要,苹果官方封装的UI控件,大部分都利用到了懒加载的思想,比如ViewControllerViewcell上的子视图等。懒加载是在用到的时候才回去加载,这样做不仅避免所用的控件同时添加到内存中,而且还防止了控件的重复创建。

声明对象时尽量避免使用New关键字,多使用init alloc.

因为使用init alloc系统会默认调用initWithZone方法分配内存空间,分配的原则是类型相近就近分配,而New只是简单初始化,内存分配随机,所以使用init alloc声明对象减少了系统寻找堆中对象浪费的资源。

缓存思想。

要想提高软件性能,开发过程中做好缓存至关重要。缓存那些经常使用到而用不怎么变化的数据。比如cell中的动态变化的行高,和图片,我们要为他们做好缓存,下次加载这些资源的时候我们就不要再重复请求,而浪费资源又消耗性能。

对开销大的对象进行约束。

比如我们经常使用的NSdateFormatter对象,初始化非常慢,Time Profile检测显示估算创建NSdateFormatter对象平均耗33ms左右,设置NSdateFormatter对象的属性也会花费大量时间。所以我们针对这样的对象要加以限制,
处理方式:
(1)用static关键字修饰NSdateFormatter对象。
(2)用GCD中的dispatch_once修饰NSdateFormatter对象。
(3)用懒加载的方式加载NSdateFormatter对象。这三种方式都是为了防止NSdateFormatter对象重复初始化,减小系统开销。

正确的选择加载数据的格式。

Josn格式的数据要比XML要快。不过josn更是适合小文档数据,因为josn数据和XML的dom格式数据都是一次性将整个数据文档加载到内存中,所以用于加载小数据更合适。加载大数据我们做好采用XML的SAX格式,因为SAX是一点点的加载到内存,然后一点点的解析,是流式的,所以更适合大数据的加载。

数据存储格式的选择。

数据的展示。

一个页面的数据展示最好要限制每一刷新加载数据的条数,不要过多,限制在10-20之内,新数据的展示和老数据的展示,最好是两个不同URL。还有针对页面中UI中有很多的View,在加载的策略上,完全可以采用多线程技术进行同步加载,只把上半部分放在主线程加载,下半部分放到子线中去加载,这样可以大大降低更新数据的时间,当上半部的数据初始化完毕,下半部分就已经在另一个线程中处理完毕,所以这种加载策略更能优化软件性能。

运用算法逻辑

逻辑运算方面的处理要考虑采用做合适的算法处理运算。尽量减少不要运算资源浪费。

在程序中尽量减少使用webview

因为我们程序中webView并不像Safari浏览器加载的那么快,没有相应的硬件支持等。

Autoreleasepool的正确使用

程序瘦身(未更新中)

征求APP优化策略

关于APP性能优化的方法,将在项目实战中持续更新。希望小伙伴们集思广益,都能参与进来,提供更好更完美的优化策略···

上一篇 下一篇

猜你喜欢

热点阅读