文章出出:http://www.code4app.com/blog-826368-158.htmlhtml
应用程序中的性能对 iOS 应用的开发来讲尤为重要,若是一个应用失去反应或者很慢,失望的用户会把他们的失望写满App Store的评论。然而因为iOS设备的限制,想处理好应用程序中的性能是一件难事。咱们在开发过程当中会有不少地方是须要注意的,固然也很容易在作出选择时忘记考虑性能影响。ios
咱们在开发中常见的错误就是没有给UITableViewCells, UICollectionViewCells,甚至是UITableViewHeaderFooterViews设置正确的reuseIdentifier。web
在优化性能时,table view用 `tableView:cellForRowAtIndexPath:` 为rows分配cells的时候,它的数据应该重用自UITableViewCell。 一个table view维持一个队列的数据可重用的UITableViewCell对象。固然若是不使用reuseIdentifier的话,每显示一行table view就须要设置全新的cell。这样一来对应用程序性能的影响很是的大,特别会使app的滚动体验大大的下降。数据库
从iOS6起,除了对UICollectionView的cells和补充views,也应该在header和footer views中使用reuseIdentifiers,使用reuseIdentifiers的话,在一个table view中添加一个新的cell时在data source 方法中添加这个方法:json
static NSString *ID = @"MyCell";缓存
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:ID];服务器
这个方法能够把那些已经存在的cell从队列中排除,或者在必要时使用先前注册的nib或者class创造新的cell。若是没有可重用的cell,也没有注册一个class或者nib的话,这个方法就会返回nil。网络
二、在开发的过程当中要尽可能把Views设置为透明色:数据结构
若是应用中有透明的Views咱们应该设置它们的opaque属性为YES。app
其缘由是这样会使系统用一个最优的方式渲染这些views。这个属性在IB或者代码里均可以设定。
Apple的文档对于为图片设置透明属性的描述是:
(opaque)这个属性给渲染系统提供了一个如何处理这个view的提示。若是设为YES, 渲染系统就认为这个view是彻底不透明的,这使得渲染系统优化一些渲染过程和提升性能。若是设置为NO,渲染系统正常地和其它内容组成这个View。默认值是YES。
在相对比较静止的画面中,设置这个属性不会有太大影响。然而当这个view嵌在scroll view里边,或者是一个复杂动画的一部分,不设置这个属性的话会在很大程度上影响app的性能。因此咱们能够在模拟器中用Debug\Color Blended Layers选项来发现哪些view没有被设置为opaque。目标就是,能设为opaque的就全设为opaque!
若是图片是从远端服务加载的你不能控制图片大小,好比在下载前调整到合适大小的话,你能够在下载完成后,最好是用background thread,缩放一次,而后在UIImageView中使用缩放后的图片。
可是使用XML也有XML的好处,好比使用SAX 来解析XML就像解析本地文件同样,咱们不需像解析json同样等到整个文档下载完成才开始解析,那么当咱们处理很大的数据的时候就会极大地减低内存消耗和增长性能。
XML的解析方式:
①DOM解析:是将文档一次性所有下载到本地在按节点进行解析,这样对咱们的应用程序的内存消耗极大,手机自己的内存就不是很大,不像电脑那样有很大的内存,可见这种解析方式不太适用于手机,即手机没法直接使用 DOM 的方式来解析 XML;
②SAX解析:是一种只读的方式,在文档中按照节点从上之下的方式来进行解析,是苹果提供的解析方式,虽然节点是一次性读取的,可是节点中的内容是屡次读取的,这种解析方式的速度至关的快,能够用 NSXMLParser 经过 代理 方法来实现解析;
SAX解析方式的步骤:
①开始文档—准备工做
②开始"节点"
③发现节点内部的内容,每个节点,可能都须要屡次解析才能完成
④结束"节点"
⑤结束文档—解析结束
以上步骤,②、③、④会不断循环,一直到全部的解析完成。
五、避免反复处理数据:
咱们的应用须要从服务器加载所需的经常使用的JSON或者XML格式的数据。在服务器端和客户端使用相同的数据结构很重要。在内存中操做数据使它们知足咱们的数据结构开销很大的。
譬如咱们须要数据来展现一个table view,最好直接从服务器取array结构的数据以免额外的中间数据结构改变。类似的,若是须要从特定key中取数据,那么就使用键值对的dictionary。
六、对tableView的优化:
Table view须要有很好的滚动性能,要不用户会在滚动过程当中发现动画的弊端,为了保证table view可以平滑滚动,咱们能够采起如下的措施:
使用`rowHeight`, `sectionFooterHeight` 和 `sectionHeaderHeight`来设定固定的高,不要请求delegate
七、用户响应:
①用户响应,即APP用户所触发的操做都能获得马上响应,即用户事件可以被主线程的Run Loop获得及时的处理;
②要让主线程的Run Loop更好的响应用户的事件,咱们应该尽可能减小在主线程作复杂的操做的时间,尤为是I/O操做,网络操做,大量复杂的运算等,这类操做务必不要在主线程中执行。
八、内存管理的优化:
①合理的利用缓存机制,能够有效的减少设备内存的占用率,从而来下降内存溢出的几率和崩溃率; ②及时的处理内存警告; ③对大数据的内存管理:从网络中获取的大文件不要直接保存到内存中,能够合理的利用沙盒的缓存机制,来减少对内存的压力; ④大量的循环建立临时变量时的内存管理:若是须要大量的且循环的建立临时的变量,咱们就须要在循环开始的时候就建立自动释放池; ⑤对图片/大文件的压缩处理:咱们在作图片上传的时候,能够先把图片压缩后在保存或者上传; ⑥减小UIWebView的应用:由于其对内存的占用率是至关高的。
九、对数据压缩:大的数据能够采用压缩返回,减小用户流量的消耗,加快APP的反映速度
十、对数据库的优化:①在数据库的设计上面能够作一些重构; ②对查询语句的一些优化; ③若是数据过多,咱们能够把其分红不一样的表或者库
十一、从代码的规范上: ①这个能够用隐形的方式来提升APP的性能,譬如:用if else 仍是用 Switch; ②CodeReview(要坚持用CodeReview来对代码进行持续的重构,从而减小代码的逻辑复杂度)。
十二、要避免过于使用庞大的XIB:XIB和StoryBoard的本质就是XML文件,解析这样的文件是至关的耗费性能的。
1三、对重用的View进行封装:若是过多的建立View的话,就意味着会消耗更多的性能,因此要对重用的View进行封装
1四、避免进行大量的日期格式的转换:频繁的转换日期的格式对APP来讲消耗的性能也是很大的
1五、对控件的渲染:若是要作一个特殊样式的按钮的话,咱们能够事先将渲染好的图片设置到按钮上,这个图片放在Bundle里面,而后跟着咱们的APP进行一块儿打包,这样就避免了画个图形让后再显示到APP的屏幕上去。