我有一个遗留应用程序,其中包含一组在预编译头文件中定义为宏的全局单例:
#define myGlobalState [MyGlobalState getInstance]
#define settingsManager [SettingsManager getInstance]
有没有办法可以从调试器repl中访问这些单例?
答案 0 :(得分:2)
我有什么方法可以从内部访问这些单身人士 调试器repl?
所以,首先,他们不是单身人士。它们是每次使用宏时都会得到评估的表达式。不幸的是,那个。
其次,以get
为前缀?这是一个明确的信号,表明代码库是由不熟悉Objective-C的人创建的,并且表明该设计可能存在其他重大问题。
最后,最简单的解决方案 - 但它改变行为 - 是创建名为myGlobalState
和settingsManager
的实际全局变量,在应用程序或库的某个初始化阶段设置它们,并摆脱它们共有#define
个。这将使它们在调试器中可用,并且可能使行为更接近原作者的意思。
或者(并且,可以说是更好的解决方案),将get
方法重命名为sharedInstance
(因为它们应该是),然后查找并替换所有myGlobalState
[MyGlobalState sharedInstance]
的实例,并完全取消宏。
对于前者,您可以直接在调试器中使用全局。对于后者,您必须在调试器中评估[MyGlobalState sharedInstance]
,但这不是什么大问题。
(并且,是的,您可以在调试器中评估[MyGlobalState getGlobalState]
,将所有错误命名的内容单独留下并将其称为一天。)