浅谈runtime

谈runtime前,我们先了解下编译时。

编译时:编译器将代码编译成机器可以识别的语言,在编译时候会检查语法。

运行时(runtime):将编译好的代码跑起来,加入内存中。与编译时的静态检查不同,运行时会在内存中做些操作和判断。

我们可以通过三种方式调用runtime:

1、OC层代码:[Instance funA]

2、Framework&Service:isKindOfClass

3、Runtime API:class_getInstanceSize

三种方式通过编译层(llvm)调用到底层的Runtime System Library,可以参照Alloc流程

通过Clang我们可以将OC代码翻译成C,底层实际是通过objc_msgSend来完成消息传递。

43和45行都会调用到sayNB方法。说以在OC层的方法调用中,底层实际是会用到runtime的objc_msgSend来进行消息传递:

对象->isa->方法(类)->cache_t(寻找bucket里的sel和imp)如果没有->methodlist(bits)

在底层通过sel是如何找到imp的呢?我们下一节再详细讲解下。

你可能感兴趣的:(浅谈runtime)