1.ARC
首先你绝壁需要在ARC环境下开发,除非你想给自己找点事情干,去选择MRC环境。
2.opaque
第二点要说的就是透明view,如果你有同名的views你应该设置他们的opaque属性为YES。
Apple的文档对于为图片设置透明属性的描述是:
(opaque)属性给渲染系统提供了一个如何处理这个view的提示。如果设为YES, 渲染系统就认为这个view是完全不透明的,这使得渲染系统优化一些渲染过程和提高性能。如果设置为NO,渲染系统正常地和其它内容组成这个View。默认值是YES。
这个属性用代码和IB中设置都很简单,并不麻烦,小小的优化积少成多。这个属性呢,在相对静止的界面设置,并不会起多大的可见作用。但是当在scrollview中镶嵌的view或在一个复杂动画里面,不设置这个属性很大程度上影响app的性能。
3.Table view
Table view优化,还是很必要的,如果在用户滑动你的Table view的时候,没事出现一个卡顿,或者闪退,项目基本就是废了。
为了保证tableview的平滑滚动,你至少需要做到下面这些点:
、正确使用标识reuseIdentifier
来重用你的cell,减轻创建带来的压力
、还是上面说的view的opaque属性,包括cell自身的使用
、来自web请求数据的子线程异步加载,主线程刷新控件。(像什么图片啥啥的,你们懂得)
、尽量不使用cellForRowAtIndexPath:
,如果你需要用到它,只用一次然后缓存结果
、使用shadowPath
来画阴影
、使用rowHeight
, sectionFooterHeight
和 sectionHeaderHeight
来设定固定的高,也就是常说的点方法调用设置属性,不调用代理方法
4.Xib、StoryBoard
Apple在相关文档中的记述是:
当你加载一个引用了图片或者声音资源的nib时,nib加载代码会把图片和声音文件写进内存。在OS X中,图片和声音资源被缓存在named cache中以便将来用到时获取。在iOS中,仅图片资源会被存进named caches。取决于你所在的平台,使用NSImage 或UIImage 的imageNamed:
方法来获取图片资源。
iOS5之后,苹果使推荐使用xib和storyboard的,但是很多的公司还是拒绝使用xib或是storyboard的,因为他的可变性可读性差,常变动的界面用这个无疑是给自己找麻烦。
如果你不得不用xib或者 storyboard的时候,尽量让他们简单。最好都能够独立存在,解耦是很必要的。
其次你需要注意的是,当你加载一个XIB的时候所有内容都被放在了内存里,包括任何图片。如果有一个不会即刻用到的view,你这就是在浪费宝贵的内存资源了。Storyboards就是另一码事儿了,storyboard仅在需要时实例化一个view controller.当加载xib时,所有图片都被chache,如果你在做OS X开发的话,声音文件也是。
5.永远不要阻塞主线程
这点我想你也很清楚,iOS开发一切要以UI展示出来的界面和用户体验度为核心。永远不要使主线程承担过多。因为UIKit在主线程上做所有工作,渲染,管理触摸反应,回应输入等都需要在它上面完成。
简单的例子就是,你在加载网络数据的时候,主线程都阻塞了,UI界面布置的再好,也呈现不出来想要的效果啊,使用GCD、 NSOperation 和 NSOperationQueues不二法则。
6.UIImageView中图片缩放
这个东西吧,说大不大说小不小影响,就像一张要求5858像素的图片,你给5757像素没啥问题,但是你给59*59像素,并不是说显示有什么问题,但渲染是消耗内存资源的啊。特别是UIImageView
嵌套在UIScrollView
中的情况下。所以在问UI或者后台要图的时候,尽量要大小合适的图片尺寸,这算是细节,形成习惯最好。如果实在没有合适的尺寸图反馈给你,最好是用background thread,缩放一次,然后在UIImageView中使用缩放后的图片。
7. 重用和延迟加载(lazy load) Views
更多的view意味着更多的渲染,也就是更多的CPU和内存消耗,对于那种嵌套了很多view在UIScrollView里边的app更是如此。
这里我们用到的技巧就是模仿UITableView
和UICollectionView
的操作: 不要一次创建所有的subview,而是当需要时才创建,当它们完成了使命,把他们放进一个可重用的队列中。
这样的话你就只需要在滚动发生时创建你的views,避免了不划算的内存分配。
创建views的能效问题也适用于你app的其它方面。想象一下一个用户点击一个按钮的时候需要呈现一个view的场景。有两种实现方法
创建并隐藏这个view当这个screen加载的时候,当需要时显示它; 当需要时才创建并展示。每个方案都有其优缺点。
用第一种方案的话因为你需要一开始就创建一个view并保持它直到不再使用,这就会更加消耗内存。然而这也会使你的app操作更敏感因为当用户点击按钮的时候它只需要改变一下这个view的可见性。
第二种方案则相反-消耗更少内存,但是会在点击按钮的时候比第一种稍显卡顿。
以上的内容,是来源于(iOS Tutorial Team 的 Marcelo Fabri,他是Movile的一名 iOS 程序员。这是他的个人网站:http://www.marcelofabri.com/,你还可以在Twitter上关注@marcelofabri_。)思想的解读以及自己的一些想法。
如果看官觉得有什么不对的地方,还请不吝赐教!
网友评论