繁体   English   中英

在Objective-C中从实例十六进制获取类

[英]Get class from instance hex in Objective-C

在调试器中看到实例变量的地址时,如何通过输入给定的内存地址来获取类?

我知道在调试器中使用p someObjectInstanceNSLog(@"%p", someObjectInstance);可以实现相反的操作(从实例获取地址NSLog(@"%p", someObjectInstance); 从代码中。 是否有类似的方法可以做到这一点?

您要的是非常不安全的。 访问未知的内存位置通常是个坏主意,但是由于您询问了以下问题:

编辑:如果在gdblldb内部,则可以执行以下操作:

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]);

在调试器中,可以在怀疑是有效的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]的结果。 它通常仅包含类名而包含更多有用的信息(如从上面的示例中可以看到的)。

正如Richard J. Ross III提到的那样,您应该小心谨慎。 调试器通常可以判断地址是否无效,例如:

(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

希望这可以帮助。

右键单击调试区域,然后选择“调试区域帮助”->“查看内存位置”

或者在Xcode文档中转到

Xcode开发人员库-> Xcode-> IDEs->调试区域帮助-> 查看内存位置

在Swift中,您可以使用unsafeBitCast

(lldb) e let $vc = unsafeBitCast(0x7fd0b3e22bc0, GooglyPuff.PhotoCollectionViewController.self)
(lldb) po $vc.navigationItem.prompt = "WOOT!"

Swift的Grand Central Dispatch教程中阅读:第2/2部分

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM