近期很多朋友問起這個方法調(diào)用的流程,小編在這里整理了一下:
小編致力于用精簡的語言說明不精簡的問題
一棍好、對象如何找到對象方法來調(diào)用:
- 對象方法存放在類中,類方法存放在元類(meta class)中允耿。
- 類調(diào)用的方法借笙,在runtime底層,會把類轉(zhuǎn)化為類對象再調(diào)用方法较锡。
- 每一個類都有一個方法列表(MethodList)(已實現(xiàn)的方法)业稼。
1.根據(jù)isa指針找到所屬類
2.根據(jù)方法編號在方法列表中找到類中的方法名
3.根據(jù)方法名到方法區(qū)找到方法的實現(xiàn)
二、類如何找到類方法來調(diào)用:
- 元類保存了類方法列表
- 元類(meteClass)是類蚂蕴,也是對象
1.根據(jù)所屬類的isa指針找到元類
2.根據(jù)方法編號在類方法列表中找到類中的方法名
3.根據(jù)方法名到方法區(qū)找到方法的實現(xiàn)
4.如果沒有低散,向父元類查找實現(xiàn)
三、方法調(diào)用總流程:
1.在對象自己緩存的方法列表中找方法編號骡楼,根據(jù)編號執(zhí)行其實現(xiàn)
2.沒有熔号,執(zhí)行 ‘一’
3.沒有找到方法編號,說明這個類沒有實現(xiàn)該方法君编,根據(jù)類的isa指針找到父類執(zhí)行‘一’
4.一直到根類也沒有方法編號跨嘉,轉(zhuǎn)向‘調(diào)用未實現(xiàn)方法的攔截’的方法可以在方法里面做處理
5.沒做處理,報錯崩潰