一.OC对象的本质

常用LLDB指令:
print p:打印

读取内存:
memory read/数量格式字节数 内存地址
x/数量格式字节数 内存地址
格式:x是16进制 f是浮点数 d是10进制

字节大小
b:byte 1字节 h:half word 2字节
w:word 4字节 g:giant word 8字节

修改内存中的值
memory write 内存地址 数值

思考:一个student对象占用多少内存空间


image.png

占用16字节

image.png

使用malloc_size()的时候是32字节 (实际分配的大小)是因为系统内部会按照16字节 再次进行对齐 (按照16 32 48 64 80 96 112。。。)
使用class_getInstanceSize()和sizeof()的时候是24字节( 成员变量对齐后所占用的大小)
sizeof()是运算符 不是函数 是在运行前就已经知道的 如果传入一个对象 则计算的是这个对象的指针大小为8 如果传入一个int 则计算就是int值为4

对象分为3类:
instance对象 :就是通过alloc出来的对象 每次调用alloc都会产生新的instance对象
实例变量内存中存储着isa 和其它成员变量

类对象 :一个类的类对象,在内存中有且只有一份


image.png

通过这个就可以验证

class对象在内存中存储的信息包括:

  1. isa指针
    2.supperclass指针
    3.类的属性信息 类的对象方法信息
    4.类的协议信息 类的成员变量信息(成员变量的描述信息 比如说是什么类型)

元类对象:(meta-class)

每个元类对象,内存中值存在一份
meta_class与class对象的内存结构是一样的,但是用途不一样

object_getClass()如果传入的是实例对象,返回的就是类对象 如果传入的是类对象 返回的就是元类对象
objc_getClass() 传入一个字符串类名 返回的就是类对象
-(Class)class +(Class)class 返回的就是类对象

你可能感兴趣的:(一.OC对象的本质)