返回

对象内存结构与创建过程分析

IOS

对象内存结构分析

首先分析对象的内存结构,我们知道oc的对象指针其实就是结构体指针,也就是说oc的对象转成c++代码后其实就是一个结构体。定义一个简单的类代码如下:

@interface Person : NSObject
{
    NSString *name;
    int age;
}

- (void)say;

@end

先忽略say方法的存在(方法跟结构体的isa指针相关,稍后再分析),可以看出来 struct Person_IMPL 的结构体定义如下:

struct Person_IMPL {
    Class isa;
    NSString *name;
    int age;
};

其中 isa 指针指向该对象的类对象,nameage 是该对象的成员变量。对象的内存结构如下图所示:

+---------------------+
|     isa指针     |
+---------------------+
|     name指针    |
+---------------------+
|     age      |
+---------------------+

对象创建过程

当我们创建一个对象时,系统会首先分配一块内存空间,然后将对象的isa指针指向该对象的类对象,并将对象的成员变量初始化为默认值。对象创建过程如下图所示:

分配内存空间
↓
将isa指针指向类对象
↓
初始化成员变量
↓
返回对象指针

接下来,我们通过代码示例来详细说明对象分配和初始化过程:

// 分配内存空间
Person *person = [[Person alloc] init];

// 将isa指针指向类对象
person->isa = [Person class];

// 初始化成员变量
person->name = @"小明";
person->age = 20;

// 返回对象指针
return person;

方法的实现

方法的实现与对象的内存结构息息相关。方法其实是一个函数指针,指向一个实现该方法的函数。当我们调用一个对象的方法时,系统会根据对象的isa指针找到该方法的实现,然后调用该函数。方法的实现如下图所示:

+------------------------+
|     方法名     |
+------------------------+
|     函数指针    |
+------------------------+

总结

通过本文的分析,我们对oc对象的内存结构及其创建过程有了更深入的了解。对象内存结构由isa指针和成员变量组成,对象创建过程包括分配内存空间、将isa指针指向类对象、初始化成员变量和返回对象指针。方法的实现与对象的内存结构息息相关,方法其实是一个函数指针,指向一个实现该方法的函数。