NSObject对象(1)

对象分3种 实例对象,类对象,元类

实例对象中有isa指针但是没有superClass指针

对象 instance

是通过类alloc 生成一个新的对象,每次alloc内存是不一样, 叫做实例对象
每一个实例对象内存中放的是成员变量的值包含isa,
isa是用来找到该对象的类对象,

NSObject *obc = [[NSObject alloc] init]
obc就是实例对象

类对象 class

中只放1份的,对象方法列表,协议列表,成员属性列表,成员变量列表
isa 和supperclass 2个指针
isa 指向元类
superClass 指向父类对象

//就是类对象 cla  obcClass obcClass2
Class cla = [NSObject class];
NSObject *obc = [[NSObject alloc] init]
Class obcClass = [obc class]
 Class obcClass2  = object_getClass(obc);
- 开头的方法放在 类对象中
每中对象只有1个类对象

isa superClass 实例对象方法信息
image.png

元类 mate-class

是用来描述类的对象
也是Class 类型的
//obcClass2 就是元类对象
Class cla = [NSObject class];
Class obcClass2  = object_getClass(cla);

+ 开头的方法放在元类对象中
每1类对象也只有1个元类对象

包含isa superClass  类方法信息

tip:调用NSObject 的类方法,若没有实现,最终会调用到NSObject的同名的实例方法。若没实现,就会走消息转发流程。

image.png

类对象和元类对象的内存结构是一样的只是存的东西不一样

设计这种类型的原因有:单一职责

isa 和superClass 的关系如下图

image.png
image.png

对象 instance

NSObject 64位系统分配多少字节给对象
NSObject 在64位就是一个
结构体里面放了一个 class的指针
所有NSObject 的结构体占用8个字节,但是 系统规定
对象内存最小分配16个字节

image.png
image.png

子类继承父类是把父类的成员变量继承过来,加上自己的,
父类的成员变量放在前面,自己的放在后面,在内存中内存是连续的


image.png

tip:将oc指针强转成c需要加__bridge

一个Person ,student ,NSObject对应占用的内存 16 16 16字节

image.png

int 占用4个字节
指针占用8个字节
一个objiect对象最少占用16个字节
内存对齐 - 结构体的内存大小 必须是最大成员对象大小的倍数
生成对象时传给alloc 的大小就是 对应结构体的大小,必须是最大成员对象大小的倍数,
iOS操作系统对 对象的分配大小是16的倍数
sizeof() 和 class_getInstanceSize() 返回的是 类对应的结构体大小是实际对象占用的大小
malloc_size() 是系统分配了多少内存

image.png

有什么不对的地方欢迎斧正。

你可能感兴趣的:(NSObject对象(1))