1.避免对UIView使用透明。原因是UIView默认是非透明,透明对性能要求较高。
2.避免过于庞大的xib。原因是当你加载xib的时候所有的内容都被放在内存了,如果有一个不会立即用到的view,就会浪费宝贵的内存资源。
3.不要阻塞主线程。原因是UIKit在主线程做渲染,管理触摸反应,回应输入,界面刷新等所有工作。涉及到外部资源读取的操作,最好用子线程来执行。对于UIView或者CALayer的frame,bounds,transform等属性的改变,消耗的资源远大于其他属性的改变。
4.使用图片符合UIImageView的尺寸。不要再运行的时候让UIImageView自行压缩,这样会降低运行时的性能。(注:手动压缩图片的方法,在context中使用drawInRect)
5.选择合适的collection。如:Array使用下标查找较快,但插入和删除较慢。set进行插入和删除很快。
6.对常用的东西进行缓存。如从网上下载的需要经常显示的图片,从后台请求的用户信息
7.设置控件圆角setCornerRadius,clipsToBounds方法会触发离屏渲染,比较耗性能。推荐使用图片代替。
8.处理低内存警告。在收到内存警告时,清除对cache的强引用,没有当前显示需要的image,以及一些其他可以再创建的对象
9.避免使用高消耗的对象。如NSDateFormatter,NSCalender。解决方法:可以将其作为属性,甚至是静态变量使用。并且setDateFormate是非常消耗资源的一个操作。
10.设置UIView的背景图片时,如果是整幅图,就采取addSubView一个UIImageView;如果是要重复平铺一个小图,就使用colorWithPatternImage,因为这个函数的设计上就是针对小图的,如果用整幅大图来做背景,反而会消耗更多内存。
11.UITableView的高度有时候会根据内容来自动计算,这种情况比较消耗资源。如果明知有哪几种高度的话,就将高度缓存重用;尽量不要在 cellForRowAtIndexPath:方法中做很多事情。不仅仅重用cell,对于section的header和footer也进行重用。
12.在临时创建大量对象时,人工使用NSAutoreleasepool,例如,一个循环用于创建包含多个对象的数组,在循环体内,即可使用@autoreleasepool包裹创建代码。
13.对于重复使用的图片使用imageNamed:来创建,对于不需重复使用的,使用imageWithContentsOfFile。
14.对于排版复杂的文字或者图文混排,使用CoreText技术。(而不是一味地堆UILabel)
15.在对渲染的效率要求较高的页面中,避免使用UILabel、UITextView等在主线程中进行排版和绘制的控件。应自定义文本控件,用TextKit或者CoreText进行文本异步绘制。另外,还有facebook的AsyncDisplayKit框架可以采用。
16.将绘制图像放在次线程中执行,如在次线程中使用 CGContext进行画图,在主线程中 layer.contents = img。
17.图片和视图的大小避免超过4096*4096,因为这是目前iphone5到iphone6p以及ipad仅仅通过GPU就直接处理的纹理尺寸上限,否则就GPU就会提交CPU先处理,这样开销很大。
18.减少视图或者layer的层级数量,在有多个层级时,可以将多图合并成一张图,再渲染显示。
19.网络优化相关:合并一些网络请求,避免频繁访问网络; 尝试预加载2-5分钟后的数据,数据控制在1-5MB之间;访问之前,先判断网络是否可用;
20.节能相关:GPS在获取用户位置之后,就进行关闭,因为它非常耗电。
21.关于后台运行。进入后台后,即尽量减少内存占用、释放所有的共享资源(如Calender或address book),因为iOS会kill后台中内存消耗最多的或者进入后台还占用共享资源的进程。