傳遞鏈
- 所謂傳遞鏈,是事件觸發(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ì)決定誰(shuí)是命中測(cè)試view,并且遞交觸摸事件給它處理晴及。
傳遞過(guò)程
- 大致的過(guò)程application –> window –> root view –>……–>lowest view,由后到前
響應(yīng)鏈
- 所謂響應(yīng)鏈掂之,是事件觸發(fā)后抗俄,系統(tǒng)怎樣決定由誰(shuí)對(duì)該事件進(jìn)行處理。
響應(yīng)器鏈(responder chain)是一系列相關(guān)的響應(yīng)器對(duì)象世舰。它開始于第一個(gè)響應(yīng)器終止于應(yīng)用對(duì)象。如果第一個(gè)responder不處理事件(沒(méi)有實(shí)現(xiàn)touches方法)槽卫,則會(huì)根據(jù)響應(yīng)鏈將事件傳遞給下一個(gè)responder跟压。
First Responder (第一響應(yīng)者)
- First responder就是在響應(yīng)鏈中第一個(gè)接收事件的對(duì)象。
傳遞過(guò)程
- 大致的過(guò)程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方法-->沒(méi)有實(shí)現(xiàn)默認(rèn)會(huì)將事件傳遞給上一個(gè)響應(yīng)者-->找到上一個(gè)響應(yīng)者-->找不到方法作廢
真機(jī)的崩潰(crash)問(wèn)題
崩潰現(xiàn)象
- 程序崩潰震蒋,在模擬器中會(huì)直接顯示崩潰并給出崩潰信息。對(duì)于已經(jīng)安裝到真機(jī)上的APP躲庄,崩潰會(huì)直接閃退
崩潰原因
低內(nèi)存閃退
程序的CPU或內(nèi)存用量過(guò)高時(shí)查剖,系統(tǒng)會(huì)干掉該程序
代碼bug
比如數(shù)組越界、插空噪窘、空引用笋庄、引用未定義方法、多線程安全性倔监、訪問(wèn)野指針直砂、發(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ī)名稱左邊的箭頭
用戶崩潰日志
通過(guò)iTunes Connect(Manage Your Applications - View Details - Crash Reports)獲取用戶的crash日志.