【问题标题】:Create and access "debugMode" variable across different classes跨不同类创建和访问“debugMode”变量
【发布时间】:2015-03-02 13:55:31
【问题描述】:

我正在尝试创建一个布尔变量 debugMode,并在几个不同的类中访问它。这样我就可以在我的 ViewController 中设置它的值一次,并且能够在我的不同类(SKScene 的子类)中访问它以显示帧速率、记录物理值等。

我读到我需要创建我的类的一个实例?我看不出这在这个程序中是如何应用的。

我是 Objective-c 的新手,非常感谢任何帮助!谢谢!

【问题讨论】:

    标签: objective-c class variables


    【解决方案1】:

    默认解决方案是预处理器定义,这是在 xcode 项目中默认设置的。

    所以,在源码中你可以放

    #ifdef DEBUG
    // code that should only run in Debug Configuration
    #endif
    

    【讨论】:

    • 如果我需要在别处运行调试代码怎么办?比如在我的每一个场景中判断是否显示帧率。
    • “其他地方”是什么意思,您可以在任何源代码文件中使用它。它由编译器的预处理器处理。
    • 顺便说一句:为了构建发布,您必须在使用发布配置的项目中添加第二个方案。
    • 对不起,我有点困惑。我将如何在另一个文件中运行它?
    • 我现在明白了!感谢您的所有帮助!
    【解决方案2】:

    因此,如果我说得对,您想要一个给定类的实例,您可以在整个应用程序中使用它而不会丢失类的状态,但这应该只存在于您的代码的DEBUG 版本中?

    好的,我们可以使用与#ifdef DEBUG 混合的单例模式来确定是否处于调试模式。

    DebugManager.h

    // Our Debug Class that we have just made up.
    // Singleton class
    @interface DebugManager : NSObject
    
    // Some properties that we want on the class
    @property (nonatomic, strong) NSString *debugName;
    @property (nonatomic, readonly) NSDate *instanceCreatedOn;
    
    // a method for us to get the shared instance of our class
    + (id)sharedDebugManager;
    
    @end
    

    DebugManager.m

    #import "DebugManager.h"
    
    @implementation DebugManager
    
    // Create a shared instance of our class unless one exists already
    + (id)sharedDebugManager
    {
        static DebugManager *sharedDebugManager = nil;
        static dispatch_once_t onceToken;
        dispatch_once(&onceToken, ^{
            sharedDebugManager = [[self alloc] init];
        }); 
    
        return sharedDebugManager;
    }
    
    - (id)init
    {
        if (self = [super init]) {
            debugName = @"Debug Instance";
            instanceCreatedOn = [NSDate new];
        }
    
        return self;
    }
    
    @end
    

    现在我们有了一个 Singleton 类设置,我们可以将以下行添加到我们的 *-Prefix.pch 中,这将为我们提供一个 DebugManager 类的实例,我们可以在整个应用程序中使用它。

    #ifdef DEBUG
        DebugManager *manager = [DebugManager sharedDebugManager];
    #endif
    

    请记住,当您想使用 manager 实例时,您需要将其包装在 #ifdef DEBUG 中,因为在生产环境中运行时,它不会再看到 manager 的实例。所以请确保你这样做:

    #ifdef DEBUG
         NSLog(@"The DebugManagers instance name is %@", [manager debugName]);
    #endif
    

    不要忘记在您的Build Settings 下的 xcode 中添加您的预处理器宏,关注this 答案以了解如何做到这一点

    如果您有任何问题,请在下方提问。

    【讨论】:

    • 我认为我们意见一致。澄清一下,我会在应用程序启动时将 debugMode 的值设置为 YES。然后,当我的应用程序运行特定场景时,我可以按照“if (debugMode) {记录玩家的坐标等}”的方式做一些事情。我知道语法会大不相同。
    • 获取DEBUG 变量所需要做的是转到Build Settings 搜索Prepocessor Macros 并在Debug 选项下添加DEBUG=1 NOT 发布选项。
    • 知道了。我只是设置 DEBUG = 1,然后,如您所说,使用 #ifdef 来记录某些消息。感谢您提供信息丰富的回复,如果我一开始不清楚,我深表歉意。另外,如何切换到发布版本?
    • 要切换到您的发布版本,您需要将方案版本更改为发布。
    • 当我进入产品>方案时,只有一个选项(我的项目名称)。我将如何更改版本?抱歉,我是 Xcode 新手。
    猜你喜欢
    • 2019-12-05
    • 2017-06-18
    • 2012-07-05
    • 2018-09-25
    • 1970-01-01
    • 1970-01-01
    • 2014-08-11
    • 1970-01-01
    相关资源
    最近更新 更多