类在内存存储

466 阅读3分钟

1、实例化对象后,指针变量p1放在栈区

(lldb) po &p1

0x00007ffeeba54160

2、读取栈地址内存可以看到p1的值,p1指针的值是一个堆地址,里面放着LGPerson isa指针

(lldb) memory read 0x00007ffeeba54160

0x7ffeeba54160: 60 03 15 03 00 60 00 00 0a 00 00 00 00 00 00 00 ..............

0x7ffeeba54170: c0 93 40 9e b2 7f 00 00 40 d4 1a 04 01 00 00 00 ..@.....@.......

(lldb) po 0x600003150360

<LGPerson: 0x600003150360>

3、isa 指针,读取isa指针地址指向的内存地址内容

(lldb) memory read 0x600003150360

0x600003150360: 08 d5 1a 04 01 00 00 00 00 00 00 00 00 00 00 00 ................

0x600003150370: 70 03 0f 58 ca 48 00 00 fb 07 00 00 00 00 00 00 p..X.H..........

4、类对象,里面有类对象isa指针****0x01041ad508

(lldb) po 0x01041ad508

LGPerson

5、读取类对象isa指针指向内存地址,可以看到存放的是元类

(lldb) memory read 0x01041ad508

0x1041ad508: e0 d4 1a 04 01 00 00 00 00 fd d0 89 ff 7f 00 00 ................

0x1041ad518: 80 db 61 02 00 60 00 00 03 00 00 00 10 80 02 00 ..a..`..........

(lldb) po 0x01041ad4e0

LGPerson

6、读取元类的isa ,可以看到存放的是nsobject

(lldb) memory read 0x01041ad4e0

0x1041ad4e0: d8 fc d0 89 ff 7f 00 00 d8 fc d0 89 ff 7f 00 00 ................

0x1041ad4f0: 00 8b d4 01 00 60 00 00 07 00 00 00 31 c0 01 00 .....`......1...

(lldb) po 0x7fff89d0fcd8

NSObject

7、读取nsobject 的isa 指针,可以看到仍然是nsobject

(lldb) memory read 0x7fff89d0fcd8

0x7fff89d0fcd8: d8 fc d0 89 ff 7f 00 00 00 fd d0 89 ff 7f 00 00 ................

0x7fff89d0fce8: 00 2c f5 00 00 60 00 00 0f 00 00 00 31 c0 09 00 .,...`......1...

(lldb) po 0x7fff89d0fd

549748068605

(lldb) po p1.superclass

NSObject

(lldb) po &p1.superclass

error: <user expression 7>:1:1: address of property expression requested

&p1.superclass

^~~~~~~~~~~~~~

(lldb) x p1.superclass

0x7fff89d0fd00: d8 fc d0 89 ff 7f 00 00 00 00 00 00 00 00 00 00 ................

0x7fff89d0fd10: 00 20 f5 00 00 60 00 00 0f 00 00 00 10 80 09 00 . ...`..........

(lldb) memory read 0x7fff89d0fd

error: memory read failed for 0x7fff89d000