返回

深入解析OC底层原理之alloc和init源码

IOS

探索Objective-C底层奥秘:alloc和init源码分析

引言

在Objective-C的世界中,alloc和init是创建对象的基石。它们是构建类和对象的关键机制,理解它们的底层原理对于深入理解Objective-C的内部运作至关重要。本文将带你深入探究alloc和init的源码,揭开它们的神秘面纱。

Alloc:申请内存

alloc方法负责为对象分配内存空间。它的实现很简单,本质上就是一个C函数malloc(sizeof(Class)),它向操作系统请求特定大小的内存,该大小由Class结构体确定。Class结构体包含指向元类指针的isa指针,元类定义了该类的元数据。

分配的内存空间用用于存储对象实例的数据成员。

Init:伴随初始化

init方法负责对分配的内存空间进行初始化。它通常由子类重写,用于设置对象状态的特定值。init方法的默认实现(如果没有重写)只是简单地将所有实例变量设置为它们的默认值。

在Objective-C中,init方法遵循一个工厂模式,它将对象创建过程与对象的初始化过程分离。这允许子类定制对象创建过程,提供特定的初始化逻辑。

Init & Isa

init方法的一个重要方面是它将对象isa指针设置为类的元类。isa指针是一个指向Class结构体的指针,它定义了对象的类型和元数据。通过将isa指针设置为元类,init方法有效地将对象与它的类联系起来。

源码分析

// alloc
void *objc_alloc(Class cls) {
  return malloc(class_getInstanceSize(cls));
}

// init
id objc_msgSend(id self, SEL op, ...) {
  struct objc_super super;
  id result;

  // Call the initializer
  super.receiver = self;
  super.class = self->isa;

  // Send the message to the initializer
  result = ((id (*)(struct objc_super *, SEL))objc_msgSendSuper)(&super, op);

  // Return the result
  return result;
}

总结

alloc和init是Objective-C对象创建和初始化的基石。alloc负责分配内存,而init负责对分配的内存进行初始化。通过理解它们底层的实现原理,你可以加深对Objective-C内部机制的了解。

参考