返回
深入浅出,剖析objc_init的神奇奥秘
IOS
2023-11-21 07:18:45
从objc_init函数说起
在苹果的官方文档中,objc_init函数被为"Objective-C runtime initialization routine",即Objective-C运行时初始化例程。这句话言简意赅,但对于初学者来说可能并不容易理解。为了更好地理解objc_init函数的作用,我们首先需要了解ObjC运行时机制。
ObjC运行时机制
ObjC运行时机制是Objective-C语言的核心。它负责管理对象的内存分配、消息发送、方法查找等一系列关键任务。ObjC运行时机制主要由以下几个组件组成:
- isa指针: 每个对象都包含一个指向其类对象的isa指针。isa指针用于标识对象的类型,并帮助ObjC运行时机制找到该对象的方法。
- 类对象: 每个类都有一个与之对应的类对象。类对象包含该类的元数据,例如类的名称、属性、方法等。
- 消息: 消息是ObjC中用来调用方法的机制。消息由一个选择器和一个或多个参数组成。选择器是一个字符串,用于标识要调用的方法。参数是传递给方法的数据。
- 方法: 方法是类的成员函数。方法可以被对象调用,以执行特定的任务。
objc_init函数的作用
objc_init函数的作用就是初始化ObjC运行时机制。当程序启动时,objc_init函数首先会被调用。objc_init函数会执行以下几个主要任务:
- 初始化isa指针: objc_init函数会为每个对象分配一个isa指针,并将其指向该对象的类对象。
- 初始化类对象: objc_init函数会为每个类创建一个类对象,并将类对象的元数据存储在其中。
- 初始化消息发送机制: objc_init函数会初始化消息发送机制,使对象能够调用方法。
静态库与动态库
静态库和动态库都是代码库的两种不同形式。静态库在链接阶段被编译到目标程序中,而动态库则在运行时被加载到目标程序中。
静态库的特点:
- 在链接阶段就被编译到目标程序中。
- 目标程序不需要外部依赖就可以直接执行。
- 目标程序体积增大,性能损耗。
动态库的特点:
- 在运行时被加载到目标程序中。
- 目标程序需要外部依赖才能执行。
- 目标程序体积较小,性能损耗较小。
程序启动流程
当程序启动时,系统会执行以下步骤:
- 加载内核: 系统首先会加载内核。内核是操作系统的核心,负责管理硬件和软件资源。
- 加载引导程序: 内核加载后,会加载引导程序。引导程序负责加载操作系统。
- 加载操作系统: 引导程序加载操作系统后,操作系统就会启动。
- 初始化ObjC运行时机制: 操作系统启动后,会调用objc_init函数来初始化ObjC运行时机制。
- 加载应用程序: 操作系统初始化完成后,就会加载应用程序。
- 执行应用程序: 应用程序加载后,就会开始执行。
总结
objc_init函数是ObjC运行时机制的核心函数。它负责初始化ObjC运行时机制,使应用程序能够使用ObjC语言编写的代码。静态库和动态库是代码库的两种不同形式。静态库在链接阶段被编译到目标程序中,而动态库则在运行时被加载到目标程序中。程序启动时,系统会执行加载内核、加载引导程序、加载操作系统、初始化ObjC运行时机制、加载应用程序、执行应用程序等步骤。