oc動態性, 運行時將代碼轉化爲runtime的C代碼數組
RunTime運行流程:函數
生成對應objc_msgSend方法 isa指針查看當前類有沒有這個方法, 以後尋找父類, 每一個方法SEL(方法選擇器)對應IMP(相似於一個編號,是函數指針,指向函數實現,找到內存裏對應函數), 直到NSObeject, 若是找不到IMP, 會進入消息轉發機制, resolveClassMethod, resolveInstanceMethod, forwardingTargetForSelector, forwardInvocation 第一個方法所屬類方法動態方法解析, 第二個和第一個相似,是對應實例方法的, 第三個是備援接受者, 第四個方法是消息重定向, 真正消息轉發,也是Aspects的核心操做, 若是都找不到調用doesNotRecognizeSelector:方法拋出異常加密
RunTime的實際應用指針
交換方法(黑魔法.hook,讓SEL1->IMP2,SEL2->IMP1),爲系統類添加自定義方法,三方Aspects 繼承
①用方法交換添加保護, 如數組賦值時添加越界判斷等等 ②統計頁面點擊數用 ③多繼承 ④自動化歸檔(kvo) ⑤NSTime內存泄漏(vc被釋放經過消息轉發找回vc) ⑥系統類添加自定義方法, 寫一些更便捷的代碼,好比控件加手勢,字典加加密方法,代碼更簡潔 內存