我正在做一个处理敏感信用卡数据的应用程序。

如果我的代码在调试模式下运行,我想将这些数据记录到控制台并进行一些文件转储。

然而,在最终的appstore版本(即当它运行在发布模式时),必须禁用所有这些(安全隐患)!

我会尽力回答我的问题;所以问题就变成了“这个解决方案是正确的还是最好的方法?”

// add `IS_DEBUG=1` to your debug build preprocessor settings  

#if( IS_DEBUG )  
#define MYLog(args...) NSLog(args)  
#else  
#define MYLog(args...)  
#endif  

当前回答

Swift和Xcode 10+

#如果DEBUG将传入任何开发/特别构建、设备或模拟器。这只适用于App Store和TestFlight版本。

例子:

#if DEBUG
   print("Not App Store or TestFlight build")
#else
   print("App Store or TestFlight build")
#endif

其他回答

熊子韬的答案和我用的很接近;我还包括文件名(通过剥离file的路径)。

#ifdef DEBUG
    #define NSLogDebug(format, ...) \
    NSLog(@"<%s:%d> %s, " format, \
    strrchr("/" __FILE__, '/') + 1, __LINE__, __PRETTY_FUNCTION__, ## __VA_ARGS__)
#else
    #define NSLogDebug(format, ...)
#endif

大多数回答说如何设置#ifdef DEBUG,没有人说如何确定调试/发布构建。

我的意见:

编辑方案->运行->构建配置:选择调试/发布。它可以控制模拟器和测试iPhone的代码状态。 编辑方案->存档->构建配置:选择调试/发布。它可以控制测试包应用程序和app Store应用程序的代码状态。

苹果已经在调试版本中包含了DEBUG标志,所以你不需要定义你自己的。

你可能还想考虑在非DEBUG模式下将NSLog重新定义为null操作,这样你的代码将更可移植,你可以只使用常规NSLog语句:

//put this in prefix.pch

#ifndef DEBUG
#undef NSLog
#define NSLog(args, ...)
#endif

在xcode 7中,在Apple LLVM 7.0下有一个字段-预处理,称为“Preprocessors Macros Not Used In Precompiled…” 我把DEBUG放在DEBUG前面,它为我使用下面的代码:

#ifdef DEBUG
    NSString* const kURL = @"http://debug.com";
#else
    NSString* const kURL = @"http://release.com";
#endif

还有一个想法需要检测:

调试模式.h

#import <Foundation/Foundation.h>

@interface DebugMode: NSObject
    +(BOOL) isDebug;
@end

调试模式.m

#import "DebugMode.h"

@implementation DebugMode
+(BOOL) isDebug {
#ifdef DEBUG
    return true;
#else
    return false;
#endif
}
@end

添加到头桥文件:

# include“DebugMode.h”

用法:

DebugMode isDebug()。

不需要在项目属性swift标志中写入内容。