中级
1、重用和延迟加载(lazy load) Views
更多的 view 意味着更多的渲染,也就是更多的 CPU 和内存消耗,对于那种嵌套了很多 view 在
UIScrollView 里边的 app 更是如此。
这里我们用到的技巧就是模仿 UITableView 和 UICollectionView 的操作: 不要一次创建所有的 subview,
而是当需要时才创建,当它们完成了使命,把他们放进一个可重用的队列中。这样的话你就只需要在
滚动发生时创建你的 views,避免了不划算的内存分配。
2、Cache, Cache, 还是 Cache!
一个极好的原则就是,缓存所需要的,也就是那些不大可能改变但是需要经常读取的东西。
我们能缓存些什么呢?一些选项是,远端服务器的响应,图片,甚至计算结果,比如 UITableView 的
行高。
NSCache 和 NSDictionary 类似,不同的是系统回收内存的时候它会自动删掉它的内容。
3、权衡渲染方法.性能能还是要 bundle 保持合适的大小。
4、处理内存警告.移除对缓存,图片 object 和其他一些可以重创建的 objects 的 strong references.
5、重用大开销对象
6、一些 objects 的初始化很慢,比如 NSDateFormatter 和 NSCalendar。然而,你又不可避免地需要使用它们,
比如从 JSON 或者 XML 中解析数据。想要避免使用这个对象的瓶颈你就需要重用他们,可以通过添加属性
到你的 class 里或者创建静态变量来实现。
7、避免反复处理数据.在服务器端和客户端使用相同的数据结构很重要。
8、选择正确的数据格式.解析 JSON 会比 XML 更快一些,JSON 也通常更小更便于传输。从 iOS5 起有了官方
内建的 JSON deserialization 就更加方便使用了。但是 XML 也有 XML 的好处,比如使用 SAX 来解析 XML 就
像解析本地文件一样,你不需像解析 json 一样等到整个文档下载完成才开始解析。当你处理很大的数据的
时候就会极大地减低内存消耗和增加性能。
9、正确设定背景图片
全屏背景图,在 view 中添加一个 UIImageView 作为一个子 View
只是某个小的 view 的背景图,你就需要用 UIColor 的 colorWithPatternImage 来做了,它会更快地渲染
也不会花费很多内存:10、减少使用 Web 特性。想要更高的性能你就要调整下你的 HTML 了。第一件要做的事就是尽可能移除不
必要的 javascript,避免使用过大的框架。能只用原生 js 就更好了。尽可能异步加载例如用户行为统计 script
这种不影响页面表达的 javascript。注意你使用的图片,保证图片的符合你使用的大小。
11、Shadow Path 。CoreAnimation 不得不先在后台得出你的图形并加好阴影然后才渲染,这开销是很大的。
使用 shadowPath 的话就避免了这个问题。使用 shadow path 的话 iOS 就不必每次都计算如何渲染,它使用
一个预先计算好的路径。但问题是自己计算 path 的话可能在某些 View 中比较困难,且每当 view 的 frame
变化的时候你都需要去 update shadow path.
12、优化 Table View
正确使用 reuseIdentifier 来重用 cells
尽量使所有的 view opaque,包括 cell 自身
避免渐变,图片缩放,后台选人
缓存行高
如果 cell 内现实的内容来自 web,使用异步加载,缓存请求结果
使用 shadowPath 来画阴影
减少 subviews 的数量
尽量不适用 cellForRowAtIndexPath:,如果你需要用到它,只用-一次然后缓存结果
使用正确的数据结构来存储数据
使用 rowHeight, sectionFooterHeight 和 sectionHeaderHeight 来设定固定的高,不要请求 delegate
13、选择正确的数据存储选项
NSUserDefaults 的问题是什么?虽然它很 nice 也很便捷,但是它只适用于小数据,比如一些简单的布
尔型的设置选项,再大点你就要考虑其它方式了
XML 这种结构化档案呢?总体来说,你需要读取整个文件到内存里去解析,这样是很不经济的。使用
SAX 又是一个很麻烦的事情。
NSCoding?不幸的是,它也需要读写文件,所以也有以上问题。
在这种应用场景下,使用 SQLite 或者 Core Data 比较好。使用这些技术你用特定的查询语句就能只加
载你需要的对象。
在性能层面来讲,SQLite 和 Core Data 是很相似的。他们的不同在于具体使用方法。
Core Data 代表一个对象的 graph model,但 SQLite 就是一个 DBMS。
Apple 在一般情况下建议使用 Core Data,但是如果你有理由不使用它,那么就去使用更加底层的 SQLite
吧。
如果你使用 SQLite,你可以用 FMDB 这个库来简化 SQLite 的操作,这样你就不用花很多经历了解 SQLite
网友评论