OC对象的本质-窥探OC对象内存结构
2020-09-25 本文已影响0人
凌云01
OC对象的本质
OC对象的本质-窥探OC对象内存结构
OC对象的本质-继承关系
上一篇文章我们分析了OC对象的本质,这一篇我们来研究OC对象的内存结构
第一种方式
Student.jpg我们首先在代码里打上断点,然后Debug->Debug Workflow->View Memory
内存地址.jpg- 在Address内输入stu的地址
- 查看内存地址,计算机分大端模式和小端模式,这里我们用的小端模式,从高地址向低地址读取。即:_age: 0x00000005 _no: 0x00000004 isa: 0x001D800100002159
第二种方式:通过LLDB
常用LLDB指令
- print、p:打印
- po : 打印对象
- 读取内存:
1.memory read/数量格式字节数 内存地址
2.x/数量格式字节数 内存地址
x/4x 0x100529f00 - 格式:
x
16进制f
是浮点型d
是十进制 - 字节大小:
b
: byte 1字节h
: half word 2字节
w
: word 4字节g
: giant word 8字节 - memory write修改内存
(lldb) po stu
<Student: 0x100529f00>
(lldb) p stu
(Student *) $6 = 0x0000000100529f00
(lldb) memory read 0x100529f00
0x100529f00: 59 21 00 00 01 80 1d 00 04 00 00 00 05 00 00 00 Y!..............
0x100529f10: 2d 5b 4e 53 53 63 72 75 62 62 65 72 41 72 72 61 -[NSScrubberArra
(lldb) x 0x100529f00
0x100529f00: 59 21 00 00 01 80 1d 00 04 00 00 00 05 00 00 00 Y!..............
0x100529f10: 2d 5b 4e 53 53 63 72 75 62 62 65 72 41 72 72 61 -[NSScrubberArra
(lldb) x/4xw 0x100529f00
0x100529f00: 0x00002159 0x001d8001 0x00000004 0x00000005
(lldb) x/4dw 0x100529f00
0x100529f00: 8537
0x100529f04: 1933313
0x100529f08: 4
0x100529f0c: 5
(lldb) x/4xb 0x100529f00
0x100529f00: 0x59 0x21 0x00 0x00
(lldb) x/16xb 0x100529f00
0x100529f00: 0x59 0x21 0x00 0x00 0x01 0x80 0x1d 0x00
0x100529f08: 0x04 0x00 0x00 0x00 0x05 0x00 0x00 0x00
(lldb)
那么回到最初:
一个NSObject对象占用多少内存?
系统分配给NSObject对象16个字节
实际使用的是指:一个指针变量所占用的内存(64bit: 8个字节 32bit:4个字节)
这里请大家思考一下:在64bit环境下,一个Person对象,一个Student对象占用多少内存呢?
@interface Person : NSObject
{
int _no;
}
@end
@implementation Person
@end
@interface Student : Person
{
int _age;
}
@end
@implementation Student
@end
答案下一篇揭晓
上一篇:OC对象的本质
下一篇:OC对象的本质-继承关系