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

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

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

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

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

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

当前回答

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

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

//put this in prefix.pch

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

其他回答

为使用Kotlin多平台ios调试模式的人添加此功能。下面是确定构建是调试还是发布的方法。

if (Platform.isDebugBinary) {
     NSLog(message ?: "", "")
}

关于Swift的解决方案,请参考这个关于SO的帖子。

基本上Swift的解决方案是这样的:

#if DEBUG
    println("I'm running in DEBUG mode")
#else
    println("I'm running in a non-DEBUG mode")
#endif

此外,您还需要在Swift Compiler - Custom Flags部分中通过- d DEBUG条目为Other Swift Flags键设置DEBUG符号。请看下面的截图举例:

Swift + Xcode 14更新。

从Xcode 8开始,你应该使用“活动编译条件”而不是“其他Swift标志”。从Xcode 9.3开始,苹果已经为新项目包含了DEBUG值:

这意味着你不需要改变任何项目设置,可以简单地使用#if DEBUG立即:

#if DEBUG
  print("something")
#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

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

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

//put this in prefix.pch

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