Lldb如果只知道内存地址,怎么获取该地址的类名呢?

lldb如果只知道内存地址,怎么获取该地址的类名呢?

内存地址是哪个的地址?类实例对象?

如果你确定那个地址指向一个objc对象, 那么就po addr

我编辑了半个小时的帖子,因为markdown代码块换行总是有问题,按了一下 cmd + enter,直接把没编辑完的帖子发出去了,,,,然后我又把帖子给删了, 算了,明天重新开一个帖子,写点我对这块的理解。。 :sob:


是这个吗?

借题发挥一下,如何判定任意地址是不是OC对象。其实都是lldbobjc的源码,博客和一些工具都是源码的演绎,这里挖掘一下原理,英文好的去看博客,英文不好的或者懒得看英文的直接看我一本正经的瞎编。
https://blog.timac.org/2016/1124-testing-if-an-arbitrary-pointer-is-a-valid-objective-c-object/

FLEX里有个功能叫做地址探索(Address Explorer),输入任意地址(指针),如果地址是OC对象,直接跳转到这个对象的详情。我最初是从这块开始对OC指针的学习,把学习过程简单总结一下。
IMG_0978

OC里有两种指针:

  1. 普通指针

  2. 不是很普通的指针NSTaggedPointer

64位系统上,OC指针的长度是64bit。但是有的时候,我们仅仅创建一个简单对象,比如:

NSString * s = @"a";
NSNumber * n = @(2);
NSIndexPath * indexPath = [NSIndexPath indexPathForRow:0 inSection:1];

信息本身“重量”只有一个 ASC II 字符 a、一个数字 2 , 两个整形 0 和 1 。为了轻量信息,我们需要一个64bit的指针,而且还需要一块额外内存,用来维护OC的runtime,比如isa等信息,这样的内存运用效率是很低的。根据香农定理,不对是真香定理,我省点内存看会各种*hub不香吗?所以机智的苹果工程师想了个真香的办法,对于这种比较简单的对象,就不给他额外的空间了。把64位指针中的一部分用来存储信息本身也就是说指针自己既是快递员,又是收件人。

来看objc源码

 #   define _OBJC_TAG_MASK (1UL<<63)#   define _OBJC_TAG_EXT_MASK (0xfUL<<60)预格式化文本将缩进 4 格
2 Likes

加油,加油

我还没编辑完,, 额。。