返回
OC alloc底层原理探秘
IOS
2023-09-17 10:42:47
前言
OC作为一门万物皆对象的语言,那么对象的创建、开辟内存空间究竟是怎样做到的?我们平时创建对象用到alloc
,alloc
底层到底怎样玩的,我们今天就探索一下alloc
底层流程。
alloc对象的本质
OC中的对象本质上是一块内存空间,对象中的属性和方法也是内存空间中的变量和函数指针。alloc
方法的作用就是为对象分配一块内存空间,然后返回这块内存空间的地址。
alloc的实现原理
alloc
方法的实现原理相对复杂,这里我们简单介绍一下:
alloc
方法首先会调用objc_allocateClassPair
函数来创建一个新的类。这个类继承自NSObject
类,并且包含了对象的所有属性和方法。- 然后,
alloc
方法会调用objc_allocateStruct
函数来为对象分配一块内存空间。这块内存空间的大小等于类的实例大小。 - 最后,
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
方法的实现原理相对复杂,但我们可以通过实例代码来理解其基本原理。