Objective c 如何动态设置一个“静态”#定义;头文件(.h)中的变量?

Objective c 如何动态设置一个“静态”#定义;头文件(.h)中的变量?,objective-c,ios4,sharekit,Objective C,Ios4,Sharekit,我在iOS项目(sharekit)中使用了一个开源组件,它们在头文件中定义了静态变量。例如,在SHKConfig.h中,他们将应用程序名称定义为: #define SHKMyAppName @"My App Name" 我想做的是让它充满活力;我不想在那个特定的文件中硬编码这些变量。由于头文件中显然没有viewdiload方法(据我所知),我怎么可能动态分配这个变量呢 这可能吗 提前非常感谢 您可以使用ifdef宏预处理器在编译时重新定义变量。你不可能“改变那个变量”,因

我在iOS项目(sharekit)中使用了一个开源组件,它们在头文件中定义了静态变量。例如,在
SHKConfig.h
中,他们将应用程序名称定义为:

#define SHKMyAppName            @"My App Name"
我想做的是让它充满活力;我不想在那个特定的文件中硬编码这些变量。由于头文件中显然没有
viewdiload
方法(据我所知),我怎么可能动态分配这个变量呢

这可能吗


提前非常感谢

您可以使用
ifdef
宏预处理器在编译时重新定义变量。你不可能“改变那个变量”,因为它根本就不是一个变量。这是一个宏,它将所有出现的
SHKMyAppName
替换为
@“我的应用程序名”

以下是您可以执行的操作。使用正在生成的项目名称定义编译器变量(可以在XCode项目配置中执行)。然后,将
#Define
替换为:

#if defined(PROJECT_APP_01_BUILD)
#define SHKMyAppName @"My App 01"
#elif defined(PROJECT_APP_02_BUILD)
#define SHKMyAppName @"My App 02"
#elif defined(PROJECT_APP_03_BUILD)
#define SHKMyAppName @"My App 03"
#endif
这样,当您编译App 01时,宏
SHKMyAppName
将替换为
@“我的App 01”。当您编译**App 02**时,宏
SHKMyAppName
将替换为
@“我的App 02”"'. 等等。

#define
总是在代码编译期间进行计算。您应该修改库以获得此功能

另一个解决方案如下。使用

+ (NSString *)getYourConstant;
方法并使用以下宏

#import "Provider.h"

#define kTheConstantYouNeed [Provider getYourConstant]

您可以将这些定义移动到单个appinfo.h文件中,并将其包含在其他标题中

这可能也是提供版本信息的好地方

例如

在SHKConfig.h中:

#include "MyAppInfo.h"
#define SHKMyAppName    MyAppName // define MyAppName elsewhere
#define SHKMyAppName    MyAppName // define MyAppName elsewhere
在MapAppInfo.h中:

#define MyAppName "Bla bla"

或者

在SHKConfig.h中:

#include "MyAppInfo.h"
#define SHKMyAppName    MyAppName // define MyAppName elsewhere
#define SHKMyAppName    MyAppName // define MyAppName elsewhere
应用程序中的编译器设置添加:

-DMyAppName=\"Bla bla\"

您是如何编译源代码的?您可能可以在编译器选项中添加一个
-D SHKMyAppName=“任意”
。老实说,我不确定这在LVVM中是否有效,但在GCC中有效。这会在运行时进行评估吗?或者只在编译期间调用该方法?(您的代码示例)在代码编译期间,所有出现的SHKMyAppName都将替换为右侧(作为字符串)。因此,在运行时,您将得到一个实际的方法调用,而不是@“我的应用程序名”。完美!非常感谢。最后一个问题,在注入该方法的文件中,我是否必须导入utilities类(在您的示例中为Provider.h),或者因为它是在宏头文件中导入的,所以我不必导入?不,您不应该。如果一个文件有权访问这个常量,那么它也会从定义它的文件中导入所有内容。这是真的,但与最初的问题无关:在第三方库中获取#define语句的某种运行时评估。请重新阅读-问题中没有提到“runtime”一词。问题是“我不想在那个特定的文件中硬编码那些变量。”此外,正如你所知,#define是在编译时处理的,而不是在运行时处理的。问题中没有出现一些单词的事实并不会改变它对我的意义。我真的认为stackoverflow应该是一个人们倾向于互相帮助的地方,而不只是自动回答问题,甚至不去想问题。@Anton,我同意@Danny。我从来没有在我的问题中提到运行时,他确实正确地回答了我最初的问题,尽管您提供了一个对我更有效的解决方案;所以我不知道是否值得投反对票。我将给@Anton一个被接受的解决方案,因为它提供了一个我最初没有想到的答案,但结果更适合我的问题。如果这不符合SO指南,请让我知道,我会纠正。谢谢对不起,我真的认为安吉洛是我理解的意思。