OC对象原理(中)结构体内存对齐

175 阅读1分钟

这是我参与更文挑战的第2天,活动详情查看: 更文挑战

上一篇博文我们探索了alloc背后的故事,最后得出了总结:alloc的核心就是分配内存,而分配内存又包含三个关键操作:

  • 分配多大的内存
  • 进行分配
  • 分配完之后,标记这块内存和类关联起来

那今天我们继续深入,探索更多的细节。

这篇文章主要是探讨alloc分配多大的内存。

我们创建一个对象分配的内存,肯定是要能装的下这个对象才行,这肯定跟类的结构有关,一个类内部包含了属性和方法,成员方法一方面会另外存放在类对象的isa指针指向的我们称之为元类(metaclass)的地方,另一方面成员方法是不可变的,所以成员方法应该是不占内存的。

那就剩下属性了,我们先判断内存大小跟对象的属性有关。我们先定义一个OC中的类:

@interface YTPerson : NSObject
{
    NSString  *name;
    NSInteger age;
    double    weight;
}
@end

@implementation YTPerson

@end

既然研究到底层,就不得不提到一点,我们知道在C语言中是没有类、对象这种数据结构的,与之相似的,C语言中只有结构体,我们使用下面这个命令将这个OC代码文件转换成C语言,看看在C语言中这个类是怎么被表示的。

xcrun -sdk iphoneos  clang -arch arm64 -rewrite-objc main.m -o main.c

main.c中我们果然能找到类似的代码:

struct YTPerson_IMPL {
	struct NSObject_IMPL NSObject_IVARS;
	NSString *name;
	NSInteger age;
	double weight;
};

这个YTPerson_IMPL结构体跟我们用OC定义的YTPerson的属性是完全对的上的。