知识小总结五 (事件传递和响应)☀️

传递链

  • 所谓传递链,是事件触发时,系统如何找到事件触发具体地点

Hit Test (命中测试)

  • iOS使用“命中测试”(hit-testing)去寻找触摸发生下的view。命中测试会执行检测判断是否改触摸点发生在某个具体的view的相对边界之内。如果检测是的,它就会递归的去检测该view的所有子view。该view的层级最底端view包含触摸点,它就成为了“命中测试view”。之后iOS就会决定谁是命中测试view,并且递交触摸事件给它处理。

传递过程

  • 大致的过程application –> window –> root view –>……–>lowest view,由后到前

响应链

  • 所谓响应链,是事件触发后,系统怎样决定由谁对该事件进行处理。
    响应器链(responder chain)是一系列相关的响应器对象。它开始于第一个响应器终止于应用对象。如果第一个responder不处理事件(没有实现touches方法),则会根据响应链将事件传递给下一个responder。

First Responder (第一响应者)

  • First responder就是在响应链中第一个接收事件的对象。

传递过程

  • 大致的过程initial view –> super view –> …..–> view controller –> window –> Application,由前到后
    inital view 是第一响应者或hit test找到的view

总结

  • UIApplication-->UIWindow-->递归找到最合适处理的控件-->控件调用touches方法-->判断是否实现touches方法-->没有实现默认会将事件传递给上一个响应者-->找到上一个响应者-->找不到方法作废

真机的崩溃(crash)问题

崩溃现象

  • 程序崩溃,在模拟器中会直接显示崩溃并给出崩溃信息。对于已经安装到真机上的APP,崩溃会直接闪退

崩溃原因

    低内存闪退

程序的CPU或内存用量过高时,系统会干掉该程序
代码bug
比如数组越界、插空、空引用、引用未定义方法、多线程安全性、访问野指针、发送未实现的selector等
Watchdog超时
如果我们的应用程序对一些特定的UI事件(比如启动、挂起、恢复、结束)响应不及时,Watchdog会把我们的应用程序干掉
使用各种手机助手导致的崩溃
用户使用如PP手机助手之类的软件下载APP,可能会被苹果封禁,造成闪退


获取崩溃日志

  • iOS设备上的应用闪退时,操作系统会生成一个崩溃报告,也叫崩溃日志,保存在设备上。

  • 崩溃日志上有很多有用的信息,包括应用是什么情况下闪退的。通常,上面有每个正在执行线程的完整堆栈跟踪信息,所以你能从中了解到闪退发生时各线程都在做什么,并分辨出闪退发生在哪个线程上。

本机崩溃日志

    XCode 的菜单Window->Organizer 选择Devices -> 选中的手机 -> 点击手机名称左边的箭头

用户崩溃日志

    通过iTunes Connect(Manage Your Applications - View Details - Crash Reports)获取用户的crash日志.

推荐阅读更多精彩内容