专注iOS开发的小渣渣

OC底层探索07-isa的走位理解

2020-09-16  本文已影响0人  Henry________

上一篇中对isa做了介绍OC底层探索06-isa本身藏了多少信息你知道吗?,下面就来看看isa在oc中的作用是什么?

isa作用

这是一幅iOS开发工程师都非常熟悉的结构图,需要每个人都必须熟记在心。通过lldb的调试、系统API两种方式,加强对这幅图的理解,巩固记忆。

isa流程图.png

isa流程

// @interface HRTest : NSObject
HRTest * test = [HRTest alloc];

(lldb) x/gx test
0x1007b8fc0: 0x001d8001000034a5
(lldb) p/x 0x001d8001000034a5 & 0x00007ffffffffff8ULL
(unsigned long long) $0 = 0x00000001000034a0    //对象的类
(lldb) po $0
HRTest
(lldb) p/x test.class
(Class) $1 = 0x00000001000034a0 HRTest  //对象的类

通过掩码获取到shiftcls里的信息与test.class地址相等。同样都是指向当前HRTest类。图中的第一步。

通过这种方式继续往下走:
(unsigned long long) $0 = 0x00000001000034a0    //对象的类
(lldb) po $0
HRTest

(lldb) x/gx 0x00000001000034a0
0x1000034a0: 0x00000001000034c8
(lldb) p/x 0x00000001000034c8 & 0x00007ffffffffff8ULL
(unsigned long long) $2 = 0x00000001000034c8   //类的元类
(lldb) po $2
HRTest

根据当前类继续往下查看,找到了类的元类。打印当前元类,虽然得到类的名称,但是0x00000001000034a0,0x00000001000034c8地址完全不同,这就是两个类对象

拿到类的元类继续走:
(unsigned long long) $2 = 0x00000001000034c8   //类的元类
0x1000034c8: 0x00007fff997fc0f0
(lldb) p/x 0x00007fff997fc0f0 & 0x00007ffffffffff8ULL
(unsigned long long) $3 = 0x00007fff997fc0f0   //根元类
(lldb) po $3
NSObject

(lldb) p/x NSObject.class   //NSObject类对象地址
(Class) $4 = 0x00007fff997fc118

根元类虽然是NSObject类,但是与我们代码中使用的NSObject地址并不相同。$4虽然是NSOject但只负责当然元类。

根元类继续:
(unsigned long long) $3 = 0x00007fff997fc0f0   //根元类
(lldb) p/x 0x00007fff997fc0f0 & 0x00007ffffffffff8ULL
(unsigned long long) $5 = 0x00007fff997fc0f0   //还是跟元类
(lldb) po $5
NSObject

验证了根元类指向自己。
图中的第四步。

总结

isa就是将对象和类,类对象和元类、元类和根元类相互建立关系

上一篇 下一篇

猜你喜欢

热点阅读