这是我参与更文挑战的第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的属性是完全对的上的。