返回

揭秘OC底层:剖析dyld应用加载流程(下)

IOS

深入解析_dyld_objc_notify_register函数

在上一篇文章中,我们了解到_dyld_objc_notify_register函数是dyld在应用程序加载过程中调用的重要函数之一。该函数有两个直接调用的参数:

  • l:这是一个指向Objective-C类对象的指针。
  • o:这是一个指向Objective-C元类对象的指针。

除了直接调用的参数外,_dyld_objc_notify_register函数还接收了一个指向_objc_symtab结构体的指针。该结构体包含了Objective-C类和元类的符号表,由dyld在应用程序加载过程中构建。

_dyld_objc_notify_register函数的作用是将Objective-C类和元类的符号注册到Objective-C运行时。这使得Objective-C运行时能够在应用程序运行时查找和使用这些类和元类。

_objc_init函数:Objective-C运行时的初始化

_objc_init函数是Objective-C运行时在应用程序启动时调用的第一个函数。该函数负责初始化Objective-C运行时的数据结构和状态。

_objc_init函数首先会调用_dyld_objc_notify_register函数,将Objective-C类和元类的符号注册到Objective-C运行时。然后,它会创建根类NSObject的实例。根类NSObject是所有Objective-C类的基类,它是Objective-C运行时中一个非常重要的类。

接下来,_objc_init函数会初始化Objective-C运行时中的各种数据结构,包括类表、元类表、消息发送表等。这些数据结构对于Objective-C运行时的正常运行至关重要。

最后,_objc_init函数会调用Objective-C的初始化函数。这些初始化函数由Objective-C编译器生成,它们负责初始化Objective-C类的静态变量和实例变量。

dyld在Objective-C运行时初始化中的作用

dyld在Objective-C运行时初始化过程中扮演着重要的角色。它负责加载Objective-C类和元类的符号,并将这些符号注册到Objective-C运行时。此外,dyld还负责调用_objc_init函数,初始化Objective-C运行时的数据结构和状态。

通过与Objective-C运行时的协作,dyld确保了Objective-C应用程序能够正确加载和运行。