在Objective-C中创建全局神模式变量的最佳方法

时间:2015-11-07 15:46:16

标签: objective-c

我希望有一些“神模式”布尔切换来快速更改我的应用程序内的功能。

之前的开发人员在一个文件中为这些文件创建了#define个宏,这些文件包含(间接)在每个其他文件中,但是有一些缺点:

  1. 每次更改都必须在git
  2. 中提交
  3. 每次更改都会强制整个项目的构建
  4. xconfig文件是否适用于此案例?我完成了我想要的东西:

    1. 创建.xconfig文件
    2. 将其添加到项目中
    3. 向其添加HACKS_TEST = YES
    4. 将预处理器宏HACKS_TEST=${HACKS_TEST}添加到项目目标
    5. 添加static BOOL const IOHacksTest = HACKS_TEST
    6. 并在记录它时,正确打印该值。但是,如果我更改HACK_TEST文件中的.xconfig值,它仍会构建整个项目。此外,添加一个'hack',需要在.xconfig文件,项目目标的预处理器宏部分和项目的全局文件中进行修改。

      1. 是否有可能在不需要整个项目构建的情况下实现这一目标?
      2. 是否有其他解决方案不需要对新的“黑客”添加进行这么多修改?
      3. 是否有其他解决方案更适合我的需求和/或更容易/更好?
      4. 将发布配置设置为NO的最佳方法是什么?
      5. 修改

        在选定的解决方案中,我还在Globals.m文件中添加了这个:

        if #debug
        
        BOOL IOHacksTest = YES;
        
        #else
        
        BOOL IOHacksTest = NO;
        
        #endif
        

        因此对于发布版本,所有“黑客”都会自动关闭。

3 个答案:

答案 0 :(得分:1)

  

每次更改都必须在git中提交

你不能,或者真的不应该试图避免这种情况。如果某些设置可能影响整个项目的工作方式,则应将其与项目一起存档。

正如您所发现的那样,将值放在.xcconfig文件中并没有比为所有内容使用#defines更有优势 - 如果您更改了xcconfig文件,则必须重建所有内容。

为避免这种情况,您需要在头文件和源文件之间拆分变量的声明和定义。所以,你有一个包含“extern”声明的goobals.h文件,如下所示:

extern BOOL IOHacksTest;

goobals.m文件包含:

BOOL IOHacksTest = YES;

然后在任何需要声明的地方包含goobals.h。如果需要更改值,则只需重新编译单个文件。

答案 1 :(得分:0)

  

1,是否有可能在不需要整体的情况下实现这一目标   项目建设?

如果您希望以不同的方式编译代码,则根据这些更改的值,则无法执行此操作。实际上,您想要项目需要重新编译,因为生成的代码需要更改。

阻止整个项目构建的最佳方法是将这些值放入头文件中,并有选择地仅在需要了解可能更改的值的文件中包含该头文件。

  
      
  1. 是否有其他解决方案不需要对新的“黑客”添加进行这么多修改?
  2.   

如果你想要编译时检测,就无法绕过它。如果更改值,则编译器必须生成新代码。如果编译器不了解您要对“更改”进行的自定义更改,编译器如何生成正确的代码?

  
      
  1. 是否有其他解决方案更适合我的需求和/或更容易/更好?
  2.   

这取决于您的实际需求,您未在原始问题中说明。如果您必须具有编译时的更改知识,则可以使用头文件,也可以将值添加到.xcconfig文件中,或者只是在项目中设置它们。但是,每次值更改时,您仍需要重新编译受影响的所有代码。

如果您希望在运行时更改设置,那么这正是NSUserDefaults的设计目标。在源代码或Info.plist文件中设置初始值,并在应用首次启动时将其设置为用户默认值。此后,您可以管理来自用户默认值的值。

  
      
  1. 将Release配置设置为NO的最佳方法是什么?
  2.   
static BOOL builtInDebugMode = !!(DEBUG);

修改

  

另外,!!(DEBUG)做什么? - Iulian Onofrei

这是一个逻辑非运营商,雇用了两次。它确保其操作数始终为1或0.它是指导你如何完成它(即在编译时考虑DEBUG或NDEBUG)。

默认情况下,对于调试版本,您的xcode配置将具有DEBUG = 1。对于发布版本,您可以将其设置为DEBUG = 0,并使用上面的代码。

只要您的代码正确处理DEBUG,这应该没问题。遗憾的是,某些代码错误地使用#ifdef DEBUG而不是#if DEBUG,这可能会导致问题。

因此,你可能会更喜欢...... ...

#if DEBUG
static BOOL builtInDebugMode = YES;
#else
static BOOL builtInDebugMode = NO;
#endif

在调试模式下编译时,DEBUG将被定义为1.当不处于调试模式时,它将不会被定义。

或者,您可以向项目文件DEBUG_VALUE

添加定义

答案 2 :(得分:-2)

您可以在NSUserDefault中设置一些值,我认为非常容易使用。

您可以在应用的UI中添加按钮以切换这些值,或者您可以让应用在首次启动时查询某个网站以获取此值,这取决于您的需求。

NSUserDefault很快。

您可以在启动时查询,并使用它app util quit。