有没有办法告诉内存在哪里查看对象属性的具体位置?

时间:2017-07-05 22:15:27

标签: objective-c memory lldb

所以这个问题可能无效,取决于我的理解,

但是,假设我们在堆上有一个对象,比如0x618000001234

如果我使用Xcode的内存调试器,要查看该地址的内存, 我只看到一堆信息,对吧?

就我的理解而言,你会在该地址找到的第一件事是isa指针,它是Class AKA objc_class

它看起来只占用8个字节 enter image description here

所以在这个例子中: enter image description here

看起来isa的内容是: 011DFFFF9C1B89F9

伟大,精致和花花公子

所以我们假设我们有一个班级

@interface testClass : NSObject
@property int testIntProperty;
@end

假设在isa之后内存中没有任何内容,它会直接进入属性, 如果我们查看内存中testClass实例的位置, 我希望前8个字节是isa,然后接下来的4个字节是int属性,然后其余的无关紧要

所以我的问题是: 在该示例中,我们可以通过查看属性的标题来判断testIntProperty将位于距对象开头8个字节处

但有没有办法确切说明它的位置,比如说有10个属性,你想知道第10个属性在哪里?

我之所以要问,是因为我想查看一个特定属性的指针,而我很难在内存中找到它。在运行时,我得到一个EXC_BAD_ACCESS,地址为0x18,但我很想在内存中查看我希望该属性存在的位置,并且我希望看到0x18在普通视野中

1 个答案:

答案 0 :(得分:0)

在现代运行时,您不能假设类的布局只是实例变量/属性的顺序;你可以在多个地方声明这些 - 接口和实现,你必须知道使用了什么填充,你不知道何时处理属性支持变量等。

但是,您可以轻松确定调试器中的偏移量。假设您使用的是testClass所以self引用的实例方法,请输入:

p (char *)&self->_testIntProperty - (char *)self

它将打印偏移量。需要强制转换才能使调试器满意。

HTH