OC对象的本质-窥探OC对象内存结构

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
  • 格式: x16进制 f是浮点型 d是十进制
  • 字节大小:b: byte 1字节 h: half word 2字节
    w: word 4字节 g: giant word 8字节
  • memory write修改内存
(lldb) po stu


(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对象的本质-继承关系

你可能感兴趣的:(OC对象的本质-窥探OC对象内存结构)