返回

OC alloc底层原理探秘

IOS

前言

OC作为一门万物皆对象的语言,那么对象的创建、开辟内存空间究竟是怎样做到的?我们平时创建对象用到allocalloc底层到底怎样玩的,我们今天就探索一下alloc底层流程。

alloc对象的本质

OC中的对象本质上是一块内存空间,对象中的属性和方法也是内存空间中的变量和函数指针。alloc方法的作用就是为对象分配一块内存空间,然后返回这块内存空间的地址。

alloc的实现原理

alloc方法的实现原理相对复杂,这里我们简单介绍一下:

  1. alloc方法首先会调用objc_allocateClassPair函数来创建一个新的类。这个类继承自NSObject类,并且包含了对象的所有属性和方法。
  2. 然后,alloc方法会调用objc_allocateStruct函数来为对象分配一块内存空间。这块内存空间的大小等于类的实例大小。
  3. 最后,alloc方法会调用objc_storeStrongProperty函数来将对象的属性值存储到内存空间中。

实例代码

// 导入头文件
#import <objc/runtime.h>

// 定义一个新的类
Class MyClass = objc_allocateClassPair([NSObject class], "MyClass", 0);

// 添加属性
objc_property_attribute_t type = { "T", "@\"NSString\"" };
objc_property_attribute_t ownership = { "C", "" };
objc_property_attribute_t attributes[] = { type, ownership };
objc_addProperty(MyClass, "name", attributes, 2);

// 添加方法
SEL nameSelector = sel_registerName("name");
IMP nameIMP = imp_implementationWithBlock(^(id self) {
    return objc_getAssociatedObject(self, nameSelector);
});
objc_addMethod(MyClass, nameSelector, nameIMP, "@@:");

// 注册类
objc_registerClassPair(MyClass);

// 创建对象
id object = objc_allocateStruct(MyClass);

// 设置属性值
objc_storeStrongProperty(object, nameSelector, @"John Doe");

// 获取属性值
NSString *name = objc_getAssociatedObject(object, nameSelector);

// 打印属性值
NSLog(@"%@", name);

总结

通过本文的介绍,我们对OC对象的创建原理有了更深入的了解。alloc方法的作用就是为对象分配一块内存空间,然后返回这块内存空间的地址。alloc方法的实现原理相对复杂,但我们可以通过实例代码来理解其基本原理。