传递链
- 所谓传递链,是事件触发时,系统如何找到事件触发具体地点
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日志.