iOS 面试 - 项目优化
淘宝下拉加载更多如何优化
TableView的性能优化
1、通过正确的设置 reuseIdentifier 来重用 Cell。
2、尽量减少不必要的透明 View。
3、尽量避免渐变效果、图片拉伸和离屏渲染。
4、当不同的行的高度不一样时,尽量缓存它们的高度值。
5、如果 Cell 展示的内容来自网络,确保用异步加载的方式来获取数据,并且缓存服务器的 response。
6、使用 shadowPath 来设置阴影效果。
7、尽量减少 subview 的数量,对于 subview 较多并且样式多变的 cell,可以考虑用异步绘制或重写 drawRect。
8、尽量优化 tableView:cellForRowAtIndexPath: 方法中的处理逻辑,如果确实要做一些处理,可以考虑做一次,缓存结果。
9、尽量不要对cell的子视图频繁添加、删除操作
10、选择合适的数据结构来承载数据,不同的数据结构对不同操作的开销是存在差异的。
11、对于 rowHeight、sectionFooterHeight、sectionHeaderHeight 尽量使用常量。
本质上是降低 CPU、GPU 的工作,从这两个大的方面去提升性能。
CPU:对象的创建和销毁、对象属性的调整、布局计算、文本的计算和排版、图片的格式转换和解码、图像的绘制。
GPU:纹理的渲染。
卡顿优化在 CPU 层面
1、尽量用轻量级的对象,比如用不到事件处理的地方,可以考虑使用 CALayer 取代 UIView。
2、不要频繁地调用 UIView 的相关属性,比如 frame、bounds、transform 等属性,尽量减少不必要的修改。
3、尽量提前计算好布局,在有需要时一次性调整对应的属性,不要多次修改属性。
4、Autolayout 会比直接设置 frame 消耗更多的 CPU 资源。
5、图片的 size 最好刚好跟 UIImageView 的 size 保持一致。
6、控制一下线程的最大并发数量。
7、尽量把耗时的操作放到子线程。
文本处理(尺寸计算、绘制)
图片处理(解码、绘制)
卡顿优化在 GPU层面
1、尽量避免短时间内大量图片的显示,尽可能将多张图片合成一张进行显示。
2、GPU能处理的最大纹理尺寸是 4096x4096,一旦超过这个尺寸,就会占用 CPU 资源进行处理,所以纹理尽量不要超过这个尺寸。
3、尽量减少视图数量和层次。
4、减少透明的视图(alpha<1),不透明的就设置 opaque 为 YES。
5、尽量避免出现离屏渲染
iOS 保持界面流畅的技巧
1、预排版,提前计算
2、预渲染,提前绘制
3、异步绘制
4、全局并发线程
5、高效的图片异步加载
iOS开发中用过哪些测试性能的工具
instruments它为什么能检测内存泄漏
如何检测应用是否卡顿
App启动过慢优化?
程序性能优化
1、使用复用机制。
2、尽可能设置 View 为不透明。
3、避免臃肿的xib文件。
4、数据缓存,比如用SDWebImage实现图片缓存,提高用户体验,节省流量。
5、不要阻塞主线程。
6、图片尺寸匹配UIImageView。
7、启用GZIP数据压缩。
8、View的复用和懒加载机制。
9、复用重大开销对象,比如 NSDateFormatter、NSCalendar。
10、加锁对性能有重大开销。
11、图形绘制替换系统控件。
12、处理MemoryWarnings。
13、减少离屏渲染(设置圆角和阴影的时候可以选用绘制的方法)。
14、优化 UITableView。
15、选择合适的数据存储方式。
16、合理的地方使用自动释放池。
17、当涉及到定位的时候,不用时最好把定位服务关闭。因为定位耗电、耗流量。
18、imageNamed和imageWithContentsOfFile。
19、减少应用启动时间。
尽量将启动过程中的处理逻辑分拆成各个异步处理流,比如网络请求、数据库访问、数据解析等等。避免臃肿的xib文件。
如果没有instruments,该如何检测memory leak, zombie object 之类的问题