Objective-C,在运行时查找全局变量?

时间:2012-10-02 11:27:32

标签: objective-c

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

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

2 个答案:

答案 0 :(得分:1)

全局变量不是Objective-C特定的构造。它是普通的C,你可以在知道它的名字时通过声明它来访问每个全局变量

extern <type> <name>;

e.g。在你的情况下

extern BOOL gStartSessionCalled;
…
gStartSessionCalled = YES;

<强>更新

如果在编译时不知道变量的名称,您仍然可以使用类似dlsym的内容在运行时找到符号地址。我不知道MacOS和Linux上是否一样,但会有类似的东西。

答案 1 :(得分:1)

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

0001924d b _gStartSessionCalled

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

static BOOL gStartSessionCalled;

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

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