前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >OC底层探索07-isa的走位理解OC底层探索07-isa的走位理解

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

作者头像
用户8893176
发布2021-08-09 11:26:49
5260
发布2021-08-09 11:26:49
举报
文章被收录于专栏:小黑娃Henry

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

isa作用

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

isa流程图.png

isa流程
代码语言:javascript
复制
// @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类。图中的第一步。

通过这种方式继续往下走:
代码语言:javascript
复制
(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地址完全不同,这就是两个类对象

  • 注意观察两个地址差了40位,猜测:类的大小占40位。(OC底层探索08-基于objc4-781类结构分析会验证)
  • 类对象的isa通过掩码后,并没有变化证明类对象中除了shiftcls其他位置都是0并不包含信息。 图中的第二步。
拿到类的元类继续走:
代码语言:javascript
复制
(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但只负责当然元类。

  • 对象有多个,但是每个类在内存中都只会存在一份。即使强如NSObject 图中的第三步。
根元类继续:
代码语言:javascript
复制
(unsigned long long) $3 = 0x00007fff997fc0f0   //根元类
(lldb) p/x 0x00007fff997fc0f0 & 0x00007ffffffffff8ULL
(unsigned long long) $5 = 0x00007fff997fc0f0   //还是跟元类
(lldb) po $5
NSObject

验证了根元类指向自己。

图中的第四步。

总结

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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020/9/16 上,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • isa作用
    • isa流程
      • 通过这种方式继续往下走:
      • 拿到类的元类继续走:
      • 根元类继续:
  • 总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档