以前一直只知道iOS調(diào)用事件流程時候,如果調(diào)用者沒有實現(xiàn)方法,那么就要最多進行三步曲,
首先,我大概說明一下OC中給一個對象發(fā)送消息是個什么過程:
遍歷當前類的方法列表,找到該方法并且執(zhí)行IMP方法體(有緩存機制提高查找效率)。
如果沒找到該方法,runtime會嘗試在
+resolveInstanceMethod:
或者
+resolveClassMethod:
中處理該方法。若方法返回YES,runtime會重新嘗試發(fā)送這個消息。
若+resolve...方法返回NO,runtime會走
-forwardingTargetForSelector:
方法允許你返回一個方法接受者(意味著可以更改方法接受者)。
若-forwardingTargetForSelector:方法返回的對象無效,runtime會走
methodSignatureForSelector:
方法嘗試獲取一個方法體對象(NSMethodSignature),若該方法沒有有效的返回值,就會報異常
unrecognized selector sent to instance。
若methodSignatureForSelector:方法返回了一個有效的方法體,runtime會走
-forwardInvocation:
方法嘗試發(fā)送消息,當然這里也可以使用
-doesNotRecognizeSelector:
方法拋出異常。
但是一直沒想到如何去用!
然后通過這篇文章有了一點小思路
http://www.itdecent.cn/p/fb9e0ee8fa82
項目地址:https://github.com/indulgeIn/YBProxyCuttingModule
另外:附帶一個利用消息轉發(fā)處理UITextField的輸入內(nèi)容限制方法:
http://www.itdecent.cn/p/0e527df5c1ef