在调试器中查看实例变量的地址时,如何通过输入给定的内存地址来获取类?
我知道调试器中的p someObjectInstance
或代码中的NSLog(@"%p", someObjectInstance);
可能相反(从实例获取地址)。是否有类似的方法来反过来做这个?
答案 0 :(得分:24)
你所要求的是非常不安全的。访问未知的内存位置通常是一个坏主意,但因为你问:
编辑:如果在gdb
或lldb
内,您可以执行以下操作:
po [(id)(0xDEADBEEF) class]
但是,如果从代码运行,请使用以下内容;
NSString *input = @"0xFAFAFA";
unsigned address = UINT_MAX; // or UINT_MAX
[[NSScanner scannerWithString:input] scanHexInt:&address];
if (address == UINT_MAX)
{
// couldn't parse input...
NSLog(@"failed to parse input");
return 0;
}
void *asRawPointer = (void *) (intptr_t) address;
id value = (__bridge id) asRawPointer;
// now do something with 'value'
NSLog(@"%@", [value class]);
答案 1 :(得分:4)
在调试器中,您可以在怀疑是有效Objective-C对象的地址上使用po
。例如,在我的一个程序中,我知道0x9549ee0
指向一个UIFont对象。
使用po
我看到以下内容:
(gdb) po 0x9549ee0
<UICFFont: 0x9549ee0> font-family: "Helvetica"; font-weight: normal; font-style: normal; font-size: 14px
这将打印出您使用以下信息获得的相同信息:
NSLog(@"%@", someObject);
也就是[someObject description]
的结果。这通常包含更多有用的信息,仅仅是类名(从上面的例子中可以看出)。
(gdb) po 0x9449ee0
0x9449ee0 does not appear to point to a valid object.
但它的做法并非万无一失。如果您在程序中的代码中执行此操作,则可能会崩溃。
哦,当然你也可以直接在变量上使用po
:
(gdb) po font
<UICFFont: 0x9549ee0> font-family: "Helvetica"; font-weight: normal; font-style: normal; font-size: 14px
希望这有帮助。
答案 2 :(得分:1)
右键单击调试区域并选择Debug Area Help-&gt;查看内存位置
或者在Xcode文档中转到
Xcode Developer Library-&gt; Xcode-&gt; IDEs-&gt; Debug Area Help-&gt; Viewing Memory Locations
答案 3 :(得分:0)
在Swift中,您可以使用unsafeBitCast
(lldb) e let $vc = unsafeBitCast(0x7fd0b3e22bc0, GooglyPuff.PhotoCollectionViewController.self)
(lldb) po $vc.navigationItem.prompt = "WOOT!"