我很想知道是否有任何方法可以在运行时找到全局变量,就像NSClassFromString一样。变量BOOL在静态库中定义,我通过使用“nm”找到了这个名称,它给出了这个输出:“0001924d b _gStartSessionCalled”。在XCode中调试时,我可以添加表达式“gStartSessionCalled”,并在应用程序运行时查看值更改。
我想要做的是找到gStartSessionCalled的值并更改值。我知道这样做有点奇怪,但请不要理会原因。
答案 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;
在您的图书馆。据我所知,您无法从定义它们的目标文件外部访问本地符号。
调试器可以使用符号表来查找地址并显示变量,但链接器拒绝链接来自不同目标文件的本地符号。