我在这个网站上被告知了几次,但我想确保确实如此.
我希望能够在我的代码中撒上NSLog函数调用,并且Xcode/gcc会在构建我的Release/Distribution版本时自动删除这些调用.
我应该避免使用它吗?如果是这样,有经验的Objective-C程序员之间最常见的选择是什么?
预处理器宏确实非常适合调试.NSLog()没有任何问题,但是使用更好的功能定义自己的日志记录功能很简单.这是我使用的,它包括文件名和行号,以便更容易跟踪日志语句.
#define DEBUG_MODE #ifdef DEBUG_MODE #define DebugLog( s, ... ) NSLog( @"<%p %@:(%d)> %@", self, [[NSString stringWithUTF8String:__FILE__] lastPathComponent], __LINE__, [NSString stringWithFormat:(s), ##__VA_ARGS__] ) #else #define DebugLog( s, ... ) #endif
我发现将整个语句放在前缀头而不是自己的文件中更容易.如果需要,可以通过让DebugLog与普通的Objective-C对象进行交互来构建更复杂的日志系统.例如,您可以拥有一个写入其自己的日志文件(或数据库)的日志记录类,并包含您可以在运行时设置的'priority'参数,因此调试消息不会显示在您的发行版本中,但错误消息是(如果你这样做,你可以使DebugLog(),WarningLog()等.
哦,请记住,#define DEBUG_MODE
可以在应用程序的不同位置重复使用.例如,在我的应用程序中,我使用它来禁用许可证密钥检查,并且只允许应用程序在特定日期之前运行.这让我可以轻松地分发一个时间有限,功能齐全的beta版本.
将这3行放在-prefix.pch文件的末尾:
#ifndef DEBUG #define NSLog(...) /* suppress NSLog when in release mode */ #endif
您无需在项目中定义任何内容,因为DEBUG
在创建项目时默认情况下会在构建设置中定义.
NSLog调用可以留在生产代码中,但只应存在于真正特殊情况下,或者需要将其记录到系统日志中的信息.
丢弃系统日志的应用程序很烦人,并且是不专业的.
我无法对Marc Charbonneau的答案发表评论,所以我会将此作为答案发布.
除了将宏添加到预编译头中之外,还可以使用Target构建配置来控制定义(或缺少定义)DEBUG_MODE
.
如果选择" 调试 "活动配置,DEBUG_MODE
将定义,宏将扩展为完整NSLog
定义.
选择" Release "活动配置将不会定义,DEBUG_MODE
并且发布版本中将NSLog
省略您的ging.
脚步:
目标>获取信息
构建标签
搜索"预处理器宏"(或GCC_PREPROCESSOR_DEFINITIONS
)
选择配置:调试
编辑此级别的定义
加 DEBUG_MODE=1
选择配置:发布
确认DEBUG_MODE
未设置GCC_PREPROCESSOR_DEFINITIONS
如果省略定义中的'='字符,则会从预处理器中收到错误
此外,将此注释(如下所示)粘贴到宏定义上方,以提醒您DEBUG_MACRO
来自定义的位置;)
// Target > Get Info > Build > GCC_PREPROCESSOR_DEFINITIONS // Configuration = Release:// = Debug: DEBUG_MODE=1
编辑:Marc Charbonneau发布的方法,并由sho引起我的注意,远比这个好.
我删除了我的答案部分,建议在禁用调试模式时使用空函数禁用日志记录.处理设置自动预处理器宏的部分仍然相关,因此它仍然存在.我还编辑了预处理器宏的名称,以便它更符合Marc Charbonneau的答案.
要在Xcode中实现自动(和预期)行为:
在项目设置中,转到"构建"选项卡,然后选择"调试"配置.找到"预处理器宏"部分,并添加一个名为的宏DEBUG_MODE
.
...
编辑:请参阅Marc Charbonneau的答案,了解使用DEBUG_MODE
宏启用和禁用日志记录的正确方法.
我同意马修的观点.生产代码中的NSLog没有任何问题.实际上,它对用户有用.也就是说,如果您使用NSLog的唯一原因是帮助调试,那么,是的,应该在您发布之前将其删除.
此外,由于您已将此标记为iPhone问题,因此NSLog会占用资源,这是iPhone几乎没有的东西.如果你NSLogging 东西在iPhone上,从您的应用程序带走处理器时间.明智地使用它.