Objective c 有没有一种方法可以告诉在内存中查找对象属性的特定位置?
所以这个问题可能是无效的,根据我的理解 但假设堆上有一个对象,比如0x61800001234 如果我使用Xcode的内存调试器来查看该地址的内存, 我只是看到一堆信息,对吗 现在就我的理解而言,您在该地址会发现的第一件事是Objective c 有没有一种方法可以告诉在内存中查找对象属性的特定位置?,objective-c,memory,lldb,Objective C,Memory,Lldb,所以这个问题可能是无效的,根据我的理解 但假设堆上有一个对象,比如0x61800001234 如果我使用Xcode的内存调试器来查看该地址的内存, 我只是看到一堆信息,对吗 现在就我的理解而言,您在该地址会发现的第一件事是isa指针,它是一个ClassAKAobjc_Class 它看起来只占用了8个字节 所以在这个例子中: 看起来isa的内容是: 011DFFF9C1B89F9 很好,很好,很漂亮 假设我们有一节课 @interface testClass : NSObject @prope
isa
指针,它是一个Class
AKAobjc_Class
它看起来只占用了8个字节
所以在这个例子中:
看起来isa
的内容是:
011DFFF9C1B89F9
很好,很好,很漂亮
假设我们有一节课
@interface testClass : NSObject
@property int testIntProperty;
@end
假设isa
之后内存中没有任何内容,它直接进入属性,
如果我们查看testClass
实例在内存中的位置,
我希望前8个字节是isa
,然后接下来的4个字节是int
属性,剩下的则无关紧要
所以我的问题是:
在该示例中,我们可以通过查看属性的头来判断testIntProperty
将位于距离对象开头8个字节的位置
但是有没有一种方法可以准确地知道它将在哪里,比如说如果有10处房产,你想知道第10处房产在哪里
我之所以问这个问题,是因为我想查看一个特定属性的指针,而我很难在内存中找到它。在运行时,我得到了一个EXC_BAD_访问,地址为
0x18
,但我很想在内存中实际查看我期望该属性存在的位置,我想清楚地看到0x18在现代运行时,你不能假定类的布局只是按顺序排列的实例变量/属性;您可以在多个位置声明这些属性-接口和实现,您必须知道使用了什么填充,您不知道何时处理属性支持变量,等等
但是,您可以在调试器中轻松确定偏移量。假设您在testClass
的实例方法中,因此self
引用它,并输入:
p (char *)&self->_testIntProperty - (char *)self
它将打印偏移量。强制转换是使调试器满意所必需的
HTH在现代运行时,您不能假定类的布局只是按顺序排列的实例变量/属性;您可以在多个位置声明这些属性-接口和实现,您必须知道使用了什么填充,您不知道何时处理属性支持变量,等等 但是,您可以在调试器中轻松确定偏移量。假设您在
testClass
的实例方法中,因此self
引用它,并输入:
p (char *)&self->_testIntProperty - (char *)self
它将打印偏移量。强制转换是使调试器满意所必需的
HTH看一看:您可以使用
call(int)[0x61800001234 testIntProperty]
检查调试器中属性的值。如果属性是指向对象的指针,请使用po[0x61800001234 testObjectProperty]
。查看:您可以使用call(int)[0x61800001234 TestInProperty]
在调试器中检查属性的值。如果属性是指向对象的指针,请使用po[0x61800001234 testObjectProperty]
。