0

我很想知道是否有任何方法可以在运行时找到全局变量,就像 NSClassFromString 一样。变量 BOOL 是在静态库中定义的,我通过使用“nm”找到了名称,该名称给出了以下输出:“0001924d b _gStartSessionCalled”。在 XCode 中调试时,我可以添加一个表达式“gStartSessionCalled”,并在应用程序运行时查看值的变化。

我想要做的是找到 gStartSessionCalled 的值并更改该值。我知道这样做有点奇怪,但请忽略原因。

4

2 回答 2

1

全局变量不是 Objective-C 特定的构造。它是纯 C 语言,您可以在知道其名称时通过声明它来访问每个全局变量

extern <type> <name>;

例如在你的情况下

extern BOOL gStartSessionCalled;
…
gStartSessionCalled = YES;

更新:

如果您在编译时不知道变量的名称,您仍然可以在运行时使用类似dlsym. 我不知道它在 MacOS 上是否与在 Linux 上相同,但会有类似的东西。

于 2012-10-02T11:40:46.720 回答
1

nm 输出中的小写字母“b”

0001924d b _gStartSessionCalled

表示这gStartSessionCalled是一个本地(非外部)符号。例如,它可以定义为

static BOOL gStartSessionCalled;

在你的图书馆。据我所知,您无法从定义它们的目标文件外部访问本地符号。

调试器可以使用符号表来查找地址并显示变量,但链接器拒绝链接来自不同目标文件的本地符号。

于 2012-10-02T12:11:16.700 回答