
傳遞鏈
- 所謂傳遞鏈,是事件觸發(fā)時(shí),系統(tǒng)如何找到事件觸發(fā)具體地點(diǎn)
Hit Test (命中測(cè)試)
- iOS使用“命中測(cè)試”(hit-testing)去尋找觸摸發(fā)生下的view。命中測(cè)試會(huì)執(zhí)行檢測(cè)判斷是否改觸摸點(diǎn)發(fā)生在某個(gè)具體的view的相對(duì)邊界之內(nèi)。如果檢測(cè)是的,它就會(huì)遞歸的去檢測(cè)該view的所有子view。該view的層級(jí)最底端view包含觸摸點(diǎn),它就成為了“命中測(cè)試view”。之后iOS就會(huì)決定誰是命中測(cè)試view,并且遞交觸摸事件給它處理。
傳遞過程
- 大致的過程application –> window –> root view –>……–>lowest view,由后到前
響應(yīng)鏈
- 所謂響應(yīng)鏈,是事件觸發(fā)后,系統(tǒng)怎樣決定由誰對(duì)該事件進(jìn)行處理。
響應(yīng)器鏈(responder chain)是一系列相關(guān)的響應(yīng)器對(duì)象。它開始于第一個(gè)響應(yīng)器終止于應(yīng)用對(duì)象。如果第一個(gè)responder不處理事件(沒有實(shí)現(xiàn)touches方法),則會(huì)根據(jù)響應(yīng)鏈將事件傳遞給下一個(gè)responder。
First Responder (第一響應(yīng)者)
- First responder就是在響應(yīng)鏈中第一個(gè)接收事件的對(duì)象。
傳遞過程
- 大致的過程initial view –> super view –> …..–> view controller –> window –> Application,由前到后
inital view 是第一響應(yīng)者或hit test找到的view
總結(jié)
- UIApplication-->UIWindow-->遞歸找到最合適處理的控件-->控件調(diào)用touches方法-->判斷是否實(shí)現(xiàn)touches方法-->沒有實(shí)現(xiàn)默認(rèn)會(huì)將事件傳遞給上一個(gè)響應(yīng)者-->找到上一個(gè)響應(yīng)者-->找不到方法作廢
真機(jī)的崩潰(crash)問題
崩潰現(xiàn)象
- 程序崩潰,在模擬器中會(huì)直接顯示崩潰并給出崩潰信息。對(duì)于已經(jīng)安裝到真機(jī)上的APP,崩潰會(huì)直接閃退
崩潰原因
低內(nèi)存閃退
程序的CPU或內(nèi)存用量過高時(shí),系統(tǒng)會(huì)干掉該程序
代碼bug
比如數(shù)組越界、插空、空引用、引用未定義方法、多線程安全性、訪問野指針、發(fā)送未實(shí)現(xiàn)的selector等
Watchdog超時(shí)
如果我們的應(yīng)用程序?qū)σ恍┨囟ǖ腢I事件(比如啟動(dòng)、掛起、恢復(fù)、結(jié)束)響應(yīng)不及時(shí),Watchdog會(huì)把我們的應(yīng)用程序干掉
使用各種手機(jī)助手導(dǎo)致的崩潰
用戶使用如PP手機(jī)助手之類的軟件下載APP,可能會(huì)被蘋果封禁,造成閃退
獲取崩潰日志
iOS設(shè)備上的應(yīng)用閃退時(shí),操作系統(tǒng)會(huì)生成一個(gè)崩潰報(bào)告,也叫崩潰日志,保存在設(shè)備上。
崩潰日志上有很多有用的信息,包括應(yīng)用是什么情況下閃退的。通常,上面有每個(gè)正在執(zhí)行線程的完整堆棧跟蹤信息,所以你能從中了解到閃退發(fā)生時(shí)各線程都在做什么,并分辨出閃退發(fā)生在哪個(gè)線程上。
本機(jī)崩潰日志
XCode 的菜單Window->Organizer 選擇Devices -> 選中的手機(jī) -> 點(diǎn)擊手機(jī)名稱左邊的箭頭
用戶崩潰日志
通過iTunes Connect(Manage Your Applications - View Details - Crash Reports)獲取用戶的crash日志.