您的位置:首页 > 移动开发 > IOS开发

iOS性能优化三部曲(中级)

2016-01-13 11:15 295 查看
在上篇iOS性能优化初级篇,了解到性能优化的一些基本技巧,下面我们就欢快的上路,继续了解一些更高一层的性能优化!!

1.重用或者延迟加载view

如果我们在启动程序时,就把所有的views新建出来,等到用到时就加载。这样的话,毫不疑问就会在内存存放着许多的views,这样明显不行。

系统的view默认都是懒加载过程,只有用到view的时候,才会新建加载,节省CPU的消耗,在我们写程序时也一定参考这种方法

2.Cache

在编程的时候,我可以使用“以空间换时间”的原则加快程序的速度。我们可以缓存一些不怎样改变但是经常需要的数据,比如:远端服务器的响应、图片、设置是一些计算结果

在通过远端服务器请求数据的时候,AFNetworking在内部实现了网络缓存的机制,如果我们要缓存其他的数据,可以通过NSCache,当系统回收内存时它内部色数据会被删除

3.图片渲染的方法

在iOS中随处可见的不同的漂亮的按钮,一般状态下我们都是使用美工已经切好的图片来设置,同样我们也可以用CALayer、CoreGraphics设置是OpenGL来完成这些功能

这两种方法各有利弊,使用事先渲染过的图片更快一些,省去了创建一个图片接着进行渲染最后显示图片的程序,但是我们需要将这些图片放入app的bundle中等待着被使用,这回加大内存空间的使用。通过渲染的方式可能会复杂一些但是当遇到动画功能时,渲染的优势就显现出来,一般的动画我们可以通过图片帧来完成,但是遇到复杂的图片时,就会显心有余而力不足了。

4.内存警告的处理

一旦一个app所占用的内存超过了系统所规定的内存,系统就会提醒我们释放部分内存,不然就会强制关闭程序的运行。在app文档中是这样描述的:如果你的app收到了内存警告,它就需要释放更多的内存空间。最佳的方式就是移除对缓存、图片对象和其他一些可以重新创建的对象

为了方便内存的管理,系统给我们提供几个接口来管理内存:

在 app delegate中使用applicationDidReceiveMemoryWarning:方法

在自定义的控制器UIViewController子类中重写父类的didReceiveMemoryWarning方法

注册接受UIApplicationDidReceiveMemoryWarningNotification的通知,一旦接受到通知就尽快释放不用的内存空间

值得一说的是UIViewController默认就会移除不可见的view,所以它的一些子类可以重写相关的方法,删除一些用不到的数据

5.对于比较消耗内存对象的重用

一些类的初始化非常慢,像NSDateFormatter和NSCalendar。对此我们可以通过两种方法进行解决它:1.同过在class中添加属性记录对象 2.创建静态变量进行实现

选择第二种方法,对象在app运行的时候会一直存于内存中,和单例对象很类似

下面我们就通过使用属性来延迟加载NSDateFormatter对象:

@property (nonatomic, strong) NSDateFormatter *formatter;
- (NSDateFormatter *)formatter {
if (_formatter == nil) {
_formatter = [[NSDateFormatter alloc] init];
// 进行一些格式等设置,此处省略一万字.......
}

return _formatter;
}


6.使用Sprite Sheets

Sprite sheets主要用于游戏开发中,由于游戏肯定需要炫酷的画面,使用Sprite sheets可以让渲染的速度加快。同样对于敌人、炮弹这些动作类元素,你可以重用这些sprites而不用每次都要重新创建。(本知识点小编也是知之甚少,就不过多叙述了)

7.数据解析

从网络或者app传输数据常用到两种格式:JSON、XML,这两种方式也各有优劣。解析JSON数据对比XML来说会更快一些,JSON也通常用于小数据的传输。对于XML数据来说,使用SAX来解析XML数据就像解析本地文件一样,不必要解析JSON一样等整个文件文档下载完成后才开始解析。这样当你处理大数据时就会极大降低内存消耗和提高性能。

当解析数据完成后,加载数据也需要注意,我们最好将数组数据转化为模型数据装入数组中,方便数据的展示。对于需要从特定的key中取数据,那就使用键值对进行操作

8.减少使用Web特性

在app中UIWebView很有用,可以用来展示网页内容或者创建UIkit很难做到的动画效果。但是UIWebView的加载并不像我们想象的那么快,这是受web的一些特性的影响。

因此想要提高性能就要调整HTML了,尽可能的移除不必要的javascript,避免使用过大的框架,使用原生js即可。我们要特别注意,我们要保证要使用的图片符合你使用的大小,可以使用Sprite Sheets提高加载速度和节约内容

9.优化Table View

在我们写程序的时候,UITableView是必用,所以说为了保证table view的平滑滚动,我们可以注意以下几点:

正确使用reuseldentifier重用可用的cell

尽量保证views的opaque属性为YES

对于图片的调整,在加载前要调整frame适当后再加载

缓存行高

如果cell内部的内容来源于网络,要异步加载并缓存请求的结果

尽量控制subViews的数量,不宜过多

尽量不适用 cellForRowAtIndexPath: 方法,如果要用到它,就缓存请求的结果

使用正确地数据结构来存储数据

最好使用属性 “rowHight”、“sectionFooterHeight”、“sectionHeaderHeight”来设置高度,最好不适用代理方法来设置,提高代码性能

10.选取正确地数据存储方式

iOS中有很多的存储方式,对于不同的数据我们要选择不同的方法,有以下几种方式存储:

使用NSUerDefauts

使用XML、JSON 或者 plist

使用NSCoding存档

使用类似SQLite的本地SQL数据库

使用 Core Data

对于NSUerDefauts,存储数据很便利,但是只使用于很小的数据存储,像一些简单的布尔类型的数据、用户等数据

对于XML需要读取文件到内存中进行解析,这样是有点麻烦,更麻烦的是使用SAX进行解析数据

NSCoding 也需要读取文件进行解析,相对于XML简单些

SQL 和 Core Data使用很类似,使用他们只需要使用特定的语句就可以进行数据的操作。苹果建议我们使用Core Data 但是它的性能不是太好,所以使用的人也不是很多,SQL使用就较广,同样我们可以使用FMDB这个库来操作它
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: