常用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对象占用多少内存空间
![](https://img.haomeiwen.com/i2884759/01082f5976f2fb9e.png)
占用16字节
![](https://img.haomeiwen.com/i2884759/904bdb4ea97f1882.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 和其它成员变量
类对象 :一个类的类对象,在内存中有且只有一份
![](https://img.haomeiwen.com/i2884759/e6fbda3ccc2f567c.png)
通过这个就可以验证
class对象在内存中存储的信息包括:
- isa指针
2.supperclass指针
3.类的属性信息 类的对象方法信息
4.类的协议信息 类的成员变量信息(成员变量的描述信息 比如说是什么类型)
元类对象:(meta-class)
每个元类对象,内存中值存在一份
meta_class与class对象的内存结构是一样的,但是用途不一样
object_getClass()如果传入的是实例对象,返回的就是类对象 如果传入的是类对象 返回的就是元类对象
objc_getClass() 传入一个字符串类名 返回的就是类对象
-(Class)class +(Class)class 返回的就是类对象
网友评论