通过上图我们可以看到,每隔 1ms,instruments 会记录一次 call stack,然后把每个方法的调用次数累加,最后就得到需要分析的数据了。所以,time profiler 记录的并不是方法调用的 duration,而是方法在单位时间内调用的 times。
上图中最前面的秒数代表的是产生这些记录的总时间,Weight 代表的是该方法在这段时间的调用中所占的比例,Self Weight 代表的是本方法自己调用中所占的比例,每个方法调用的最右边可以看到该方法所在的 framework。
我们可以通过右边的 extended detail 来快速找到最耗时的方法,点击过后,左边的 tree view 就会为你展示出来。
上图的左边部分是应用中产生过对象的类,中间部分是对象之间的引用关系,右边部分是对象产生的调用栈。
灰色的线代表的是弱引用,黑色的线代表强引用,要启用 visual debug 必须关闭 sanitizers。
- 用标准的 label 控件,因为苹果会为其优化,而这些优化随着升级你也会免费得到。
- 用更现代的布局方法,auto layout,文本系统会缓存一些布局信息,对性能提升有很大作用。
- 尽量给 attributedString 提供更多的信息,比如字体大小、文本颜色、paragraph style 等。
- 中文字体由于需要字体回调,所以性能更差一些。
手势是先于 responder chain 识别的。
一个手势识别后,另一个手势 state 会被置为 failed,当然 target 的 action 不会被调用。
当然你也可以通过 delegate 的方法让多个手势同时识别。
你还可以让两个手势之前具有必要关系,一个手势失败后,另一个手势才开始识别。
而手势识别之前,hit-test 才是关键,它将手势识别的范围缩小,找到最适合响应的 view,然后将 touch 传递给这个 view 上所有的手势识别器。