所以这个问题可能无效,取决于我的理解,
但是,假设我们在堆上有一个对象,比如0x618000001234
如果我使用Xcode的内存调试器,要查看该地址的内存, 我只看到一堆信息,对吧?
就我的理解而言,你会在该地址找到的第一件事是isa
指针,它是Class
AKA objc_class
看起来isa
的内容是:
011DFFFF9C1B89F9
伟大,精致和花花公子
所以我们假设我们有一个班级
@interface testClass : NSObject
@property int testIntProperty;
@end
假设在isa
之后内存中没有任何内容,它会直接进入属性,
如果我们查看内存中testClass
实例的位置,
我希望前8个字节是isa
,然后接下来的4个字节是int
属性,然后其余的无关紧要
所以我的问题是:
在该示例中,我们可以通过查看属性的标题来判断testIntProperty
将位于距对象开头8个字节处
但有没有办法确切说明它的位置,比如说有10个属性,你想知道第10个属性在哪里?
我之所以要问,是因为我想查看一个特定属性的指针,而我很难在内存中找到它。在运行时,我得到一个EXC_BAD_ACCESS,地址为0x18
,但我很想在内存中查看我希望该属性存在的位置,并且我希望看到0x18在普通视野中
答案 0 :(得分:0)
在现代运行时,您不能假设类的布局只是实例变量/属性的顺序;你可以在多个地方声明这些 - 接口和实现,你必须知道使用了什么填充,你不知道何时处理属性支持变量等。
但是,您可以轻松确定调试器中的偏移量。假设您使用的是testClass
所以self
引用的实例方法,请输入:
p (char *)&self->_testIntProperty - (char *)self
它将打印偏移量。需要强制转换才能使调试器满意。
HTH