Runtime objc4-779.1 一圖看懂iOS Runtime消息轉發

消息發送流程圖

設定消息接受者爲receiver
圖是用markdown畫的,適配可能有點問題,瀏覽器頁面放大看好一些

Created with Raphaël 2.2.0開始objc_msgSend(receiver, SEL)通過receiver,獲取isa指針,並獲取其class在class的cache中查找SEL是否存在?匹配Method,執行IMP結束在class的method_list中查找SEL是否存在?在去父類中查找SEL是否存在?當前類爲NSObject,SEL是否存在?resolveInstanceMethod or resolveClassMethodforwardingTargetForSelector返回其他接收者?重新發送消息給新的接收者methodSignatureForSelector是否返回方法簽名?forwardInvocationunrecognized selector sent to instanceyesnoyesnoyesnoyesnoyesnoyesnoyesno

這個過程很多博文都介紹過,在此不再累贅.我們只提煉出裏邊需要我們注意的內容即可.

總結一下

  • 1,方法的調用都是通過objc_msgSend(receiver,SEL...)做到的,OC的方法中有兩個默認值,self, _cmd
  • 2,方法在類中查找的過程中會優先去cache中,然後再去method_list查找,如果都沒有,沿着繼承鏈,遞歸查找
  • 3,如果在繼承鏈上沒有找到,那麼就進入消息轉發過程
  • 4,如果找到了,方法會被記錄到cache中,方便下次查找
  • 5,其實在查找方法的過程中,Runtime還做了各種異常處理,比如class不存在,class沒有初始化等等
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章