知識(shí)性問(wèn)題
- 什么是響應(yīng)鏈律秃,它是怎么工作的拧烦?
- 如何訪問(wèn)并修改一個(gè)類(lèi)的私有屬性佑刷?
- iOS Extension 是什么莉擒?能列舉幾個(gè)常用的 Extension 么?
- 如何把一個(gè)包含自定義對(duì)象的數(shù)組序列化到磁盤(pán)瘫絮?
- 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)類(lèi)似記錄日志這樣的功能歼疮?
-
+load
和+initialize
的區(qū)別是什么杂抽? - 如何讓 Category 支持屬性?
-
NSOperation
相比于 GCD 有哪些優(yōu)勢(shì)韩脏? -
strong
/weak
/unsafe_unretained
的區(qū)別缩麸? - 如何為 Class 定義一個(gè)對(duì)外只讀對(duì)內(nèi)可讀寫(xiě)的屬性?
- 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ì)象的基類(lèi), 它不僅為事件處理, 而且也為常見(jiàn)的響應(yīng)者行為定義編程接口. UIApplication,UIView和所有從UIView派生出來(lái)的UIKit類(lèi) (包括UIWindow) 都直接或間接地繼承自UIResponder類(lèi).
第一響應(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)者將事件傳遞給它的視圖控制器(如果有的話), 然后是它的父視圖.
- 類(lèi)似的, 視圖層次中的每個(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….方法