知識(shí)性問(wèn)題
- 什么是響應(yīng)鏈,它是怎么工作的?
- 如何訪問(wèn)并修改一個(gè)類的私有屬性?
- iOS Extension 是什么?能列舉幾個(gè)常用的 Extension 么?
- 如何把一個(gè)包含自定義對(duì)象的數(shù)組序列化到磁盤?
- Apple Pay 是什么?它的大概工作流程是怎樣的?
- iOS 的沙盒目錄結(jié)構(gòu)是怎樣的? App Bundle 里面都有什么?
- iOS 的簽名機(jī)制大概是怎樣的?
- iOS 7的多任務(wù)添加了哪兩個(gè)新的 API? 各自的使用場(chǎng)景是什么?
- Objective-C 的
class是如何實(shí)現(xiàn)的?Selector是如何被轉(zhuǎn)化為 C 語(yǔ)言的函數(shù)調(diào)用的? -
UIScrollView大概是如何實(shí)現(xiàn)的,它是如何捕捉、響應(yīng)手勢(shì)的? - Objective-C 如何對(duì)已有的方法,添加自己的功能代碼以實(shí)現(xiàn)類似記錄日志這樣的功能?
-
+load和+initialize的區(qū)別是什么? - 如何讓 Category 支持屬性?
-
NSOperation相比于 GCD 有哪些優(yōu)勢(shì)? -
strong/weak/unsafe_unretained的區(qū)別? - 如何為 Class 定義一個(gè)對(duì)外只讀對(duì)內(nèi)可讀寫的屬性?
- Objective-C 中,meta-class 指的是什么?
-
UIView和CALayer之間的關(guān)系? -
+[UIView animateWithDuration:animations:completion:]內(nèi)部大概是如何實(shí)現(xiàn)的? - 什么時(shí)候會(huì)發(fā)生「隱式動(dòng)畫(huà)」?
- 如何處理異步的網(wǎng)絡(luò)請(qǐng)求?
-
frame和bounds的區(qū)別是什么? - 如何把一張大圖縮小為1/4大小的縮略圖?
- 一個(gè) App 會(huì)處于哪些狀態(tài)?
- Push Notification 是如何工作的?
- 什么是 Runloop?
- Toll-Free Bridging 是什么?什么情況下會(huì)使用?
- 當(dāng)系統(tǒng)出現(xiàn)內(nèi)存警告時(shí)會(huì)發(fā)生什么?
- 什么是
Protocol,Delegate 一般是怎么用的? - autorelease 對(duì)象在什么情況下會(huì)被釋放?
- UIWebView 有哪些性能問(wèn)題?有沒(méi)有可替代的方案。
- 為什么 NotificationCenter 要 removeObserver? 如何實(shí)現(xiàn)自動(dòng) remove?
- 當(dāng)
TableView的Cell改變時(shí),如何讓這些改變以動(dòng)畫(huà)的形式呈現(xiàn)?
1.什么是響應(yīng)鏈,它是怎么工作的?
響應(yīng)者對(duì)象和響應(yīng)者鏈
響應(yīng)者對(duì)象是可以響應(yīng)事件并對(duì)其進(jìn)行處理的對(duì)象. UIResponder是所有響應(yīng)者對(duì)象的基類, 它不僅為事件處理, 而且也為常見(jiàn)的響應(yīng)者行為定義編程接口. UIApplication,UIView和所有從UIView派生出來(lái)的UIKit類 (包括UIWindow) 都直接或間接地繼承自UIResponder類.
第一響應(yīng)者是應(yīng)用程序中當(dāng)前負(fù)責(zé)接收觸摸事件的響應(yīng)者對(duì)象(通常是一個(gè)UIView對(duì)象). UIWindow對(duì)象以消息的形式將事件發(fā)送給第一響應(yīng)者, 使其有機(jī)會(huì)首先處理事件. 如果第一響應(yīng)者沒(méi)有處理, 系統(tǒng)就將事件(通過(guò)消息)傳遞給響應(yīng)者鏈中的下一個(gè)響應(yīng)者, 看看它是否可以進(jìn)行處理.
響應(yīng)者鏈一系列鏈接在一起的響應(yīng)者對(duì)象, 它允許響應(yīng)者對(duì)象將處理事件的責(zé)任傳遞給其他更高級(jí)別的對(duì)象. 隨著應(yīng)用程序?qū)ふ夷軌蛱幚硎录膶?duì)象, 事件就在響應(yīng)者鏈中向上傳遞. 響應(yīng)者鏈由一系列"下一個(gè)響應(yīng)者"組成, 其順序如下:
- 第一響應(yīng)者將事件傳遞給它的視圖控制器(如果有的話), 然后是它的父視圖.
- 類似的, 視圖層次中的每個(gè)后續(xù)視圖都首先傳遞給它的視圖控制器(如果有的話), 然后是它的父視圖.
- UIWindow對(duì)象將事件傳遞給UIApplication單利對(duì)象
如果應(yīng)用程序找不到能夠處理事件的響應(yīng)者對(duì)象, 則丟棄該對(duì)象.
響應(yīng)者鏈中的所有響應(yīng)者對(duì)象都可以實(shí)現(xiàn)UIResponder的某個(gè)事件處理方法, 因此也都可以接受事件消息. 但是, 它們都不愿處理或只是部分處理某些事件. 如果是那些的話, 它們就可以將事件消息傳送給下一個(gè)響應(yīng)者.
事件的傳遞
發(fā)生觸摸事件后,系統(tǒng)會(huì)將該事件加入到一個(gè)由UIApplication管理的事件 隊(duì)列中,UIApplication會(huì)從事件隊(duì)列中取出最前面的事件,并將事件分發(fā)下去以便處理,通常,先發(fā)送事件給應(yīng)用程序的主窗口(keyWindow),主窗口會(huì)在視圖層次結(jié)構(gòu)中找到一個(gè)最合適的視圖來(lái)處理觸摸事件,但是這僅僅是整個(gè)事件處理過(guò)程的 第一步 找到合適的視圖控件后,就會(huì)調(diào)用視圖控件的touches方法來(lái)作具體的事件處理, 這些touches方法的默認(rèn)做法是將事件順著響應(yīng)者鏈條向上傳遞,將事件交給上一個(gè)響應(yīng)者進(jìn)行處理.
事件傳遞的完整過(guò)程
先將事件對(duì)象由上往下傳遞(由父控件傳遞給子控件),找到最合適的控件來(lái)處理這個(gè)事件。 調(diào)用最合適控件的touches….方法 如果調(diào)用了[super touches….];就會(huì)將事件順著響應(yīng)者鏈條往上傳遞,傳遞給上一個(gè)響應(yīng)者 接著就會(huì)調(diào)用上一個(gè)響應(yīng)者的touches….方法