返回

OC中的对象底层创建原理- alloc()底层黑科技解密

IOS

在Objective-C中,对象是万物之源。一切皆对象,包括我们使用的NSString、NSArray等系统类,以及我们自己定义的自定义类。这些对象是如何创建的呢?这就要从alloc()函数说起。

alloc()函数的底层原理

当我们使用alloc()函数创建对象时,实际上发生了以下一系列底层操作:

  1. objc_msgSend()消息发送 :alloc()函数本质上是对类对象的objc_msgSend()消息发送。objc_msgSend()函数是Objective-C中消息发送的底层实现,它将消息(alloc)发送给类对象(比如NSString类对象),并返回一个指向新创建对象的指针。
  2. objc_allocateClassPair()类创建 :收到alloc消息后,类对象会调用objc_allocateClassPair()函数创建一个新的类对象。这个新的类对象是原始类对象的子类,它拥有与原始类对象相同的方法和属性,但拥有不同的isa指针。
  3. isa指针设置 :新创建的对象的isa指针指向新创建的类对象。isa指针指向对象的类对象,用于确定对象的类型和查找方法。
  4. 内存分配 :objc_allocateClassPair()函数还会分配内存空间来存储对象的数据。对象的内存布局遵循特定的格式,包括实例变量、方法表和isa指针等。
  5. 对象初始化 :对象创建完成后,会调用对象的初始化方法(init方法)对对象进行初始化。init方法负责设置对象的初始状态,例如分配内存、设置属性等。

元类

在OC中,每个类都有一个与之对应的元类。元类是类的类,它存储了类本身的信息,例如类名、父类、方法列表等。类对象的isa指针指向其元类。

当我们使用alloc()创建对象时,实际上是向元类发送alloc消息。元类收到alloc消息后,会创建一个新的类对象,并返回一个指向新创建对象的指针。新创建的对象的isa指针指向新创建的类对象,类对象的isa指针指向元类。

总结

通过以上分析,我们可以总结出OC对象底层创建的原理:

  1. 使用alloc()函数创建对象,本质上是对类对象的objc_msgSend()消息发送。
  2. 类对象收到alloc消息后,调用objc_allocateClassPair()函数创建一个新的类对象。
  3. 新创建的对象的isa指针指向新创建的类对象,类对象的isa指针指向元类。
  4. 对象创建完成后,会调用对象的初始化方法对对象进行初始化。