1.web加载渲染过程
2.组件化,路由和taget-action两种方案的优劣
3.算法
-
判断链表是否有环,一亿个数
快慢指针,直到两个指针相遇或者到达尾部
4.runloop线程保活
5.runloop监听卡顿
6.网路层的优化
要点 : dns缓存 弱网环境优化 包体积大小
域名合并:
淘宝、美团等公司公布的解决方案中都有提到,就是将公司原来的很多域名都合并到较少的几个域名。为什么?因为 HTTP 的通道复用就是基于域名划分的。如果域名只有几个,那么多数请求都可以在长连接通道进行,这样就可以降低延迟、增加成功率 预热,尽早建立长连接。这样其他的业务请求就可以复用长连接通道。加快访问速度。因为每次建立连接都需要经过 DNS 域名解析、TCP 三次握手等漫长步骤。建立长连接的时机可以考虑:冷启动、前后台切换、网络切换等 如果情况允许,可以将网络切换到 HTTP 2.0,解决了 HTTP1.1 的 head of blocking ,降低了网络延迟,提供了更强大的多路复用技术。还加入了流量控制、新的二进制格式、Server Push、请求优先级和依赖等待等特性。 建立多通道。比如携程、艺龙、美团等公司都有自己的 TCP、UDP 通道。具有多域名共用通道。 有些超级大厂还自研了协议。比如 QUIC 加入 CDN 加速,动态静态资源分离 对于类似埋点的业务数据请求,可以合并请求,减小流量。另外结合埋点数据压缩上传 App 网络情况诊断 根据网络情况,动态设置超时时间等
7.包大小优化
8.启动速度优化(runtime和dyld阶段之间还有其他的)减少不必要的framework,因为动态链接比较耗时
heck framework应当设为optional和required,如果该framework在当前App支持的所有iOS系统版本都存在,那么就设为required,否则就设为optional,因为optional会有些额外的检查
合并或者删减一些OC类,关于清理项目中没用到的类,使用工具AppCode代码检查功能,查到当前项目中没有用到的类, 删减一些无用的静态变量, 删减没有被调用到或者已经废弃的方法.
将不必须在+load方法中做的事情延迟到+initialize中 尽量不要用C++虚函数(创建虚函数表有开销) main()调用之后的加载时间
在main()被调用之后,App的主要工作就是初始化必要的服务,显示首页内容等。而我们的优化也是围绕如何能够快速展现首页来开展。 App通常在AppDelegate类中的- (BOOL)Application:(UIApplication *)Application
didFinishLaunchingWithOptions:(NSDictionary *)launchOptions方法中创建首页需要展示的view,然后在当前unloop的末尾,主动调用CA::Transaction::commit完成视图的渲染。
而视图的渲染主要涉及三个阶段:
准备阶段 这里主要是图片的解码
布局阶段 首页所有UIView的- (void)layoutSubViews()运行
绘制阶段 首页所有UIView的- (void)drawRect:(CGRect)rect运行
再加上启动之后必要服务的启动、必要数据的创建和读取,这些就是我们可以尝试优化的地方
因此,对于main()函数调用之前我们可以优化的点有:
不使用xib,直接视用代码加载首页视图 NSUserDefaults实际上是在Library文件夹下会生产一个plist文件,如果文件太大的话一次能读取到内存中可能很耗时,这个影响需要评估,如果耗时很大的话需要拆分(需考虑老版本覆盖安装兼容问题)
每次用NSLog方式打印会隐式的创建一个Calendar,因此需要删减启动时各业务方打的log,或者仅仅针对内测版输出log 梳理应用启动时发送的所有网络请求,是否可以统一在异步线程请求
9.离屏渲染
阴影 cornerRedius+clipstoBounds mask 透明度
runloop有个60fps回调,绘制内容交给GPU渲染,包括view拼接,纹理的渲染。
CPU计算好显示内容提交到GPU,GPU渲染完成后将渲染结果放入帧缓冲区
1 当前屏幕渲染,指的是GPU的渲染操作是在当前用于显示的屏幕缓冲区中进行
2 离屏渲染,指的是GPU在当前屏幕缓冲区以外新开辟一个缓冲区进行渲染操
3 重写了drawRect方法,并且使用任何Core Graphics的技术进行了绘制操作,就涉及到了CPU渲染
4 CoreGraphic通常是线程安全的,所以可以进行异步绘制,显示的时候再放回主线程
10.响应者链
-
Initial view 尝试着去处理事件或者消息。如果不能处理事件,它就递交事件给
superview,因为这个initial view并不是视图控制器层级中得顶级view. -
这个
superview尝试去处理该事件,如果superview不能处理该事件,它就递交事件给它的父view,因为它也不是view层级的顶级view。 -
视图控制器的顶级view尝试着去处理该事件,如果连顶级view都不能处理该事件,它就递交事件给它的
controller。 -
这个viewcontroller尝试着去处理该事件,并且如果它不能处理该事件,它就会递交事件给window。
-
如果window不能处理该事件,它就递交事件给singlegon app object(既UIApplication)
-
如果连application都不能处理该事件,那么毫无疑问该事件将会被丢弃。
响应事件+响应者链条(单向 从子控件到父控件)
UIAppliction --> UIWiondw -->递归找到最适合处理事件的控件-->控件调用touches方法-->判断是否实现touches方法-->没有实现默认会将事件传递给上一个响应者-->找到上一个响应者
用户点击屏幕后产生的一个触摸事件,经过一些列的传递过程后,会找到最合适的视图控件来处理这个事件
整个响应顺序是从上到下再从下到上; 响应者链的响应事件是从下到上
如何找到合适控件处理事件 触摸事件是从父控件传递到子控件:
-
自己能否接收触摸事件
-
触摸点是否在自己身上
-
从后往前遍历子控件 重复前面2个步骤
-
没有合适的子控件 就自己做处理