摘自:原文??
整理出來的干活如下:
這片文章重要的在于了解runtime中objc_msgSend 底層運行機制,至于多重代理,在降低耦合度上 真的很贊!還能給ViewController減負。
在舉例之前 我們先了解一個過程,實例如何調用一個已存在的方法的過程,我們暫定這個過程為Instant find Method過程 IFM
過程如下:
1.通過object的isa指針找到它的class
2.在class的method_list中找到method
3.如果沒有找到method,則會向superclass超找
4.如果找到了,執行method?
知道這個過程后,以objc_msgSend(A, @selector(m), p)舉例,runtime層面的執行過程:
具體的運行步驟:
1.A實例執行IFM過程,如果沒有找到,繼續
2.Dynamic Method Resolution(動態方法決議):自動調用resolveInstanceMethod:(SEL)sel方法,如果用class_addMethod動態添加了方法,并且返回YES,則重新發送消息,執行動態方法。如果返回是NO,繼續
3.Message Forwarding(消息轉發):自動調用:-(id)forwardingTargetForSelector:(SEL)aSelector,如果返回不為空或self,則執行此消息,如果返回為nil或者self,調用- (NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector獲取方法簽名,方法簽名記錄了方法的參數和返回值的信息,如果還返回nil
4.拋出unrecognized selector exception異常,crash