Objective c 目标C:从';分销'/生产构建?
更新: 更多信息请点击此处: ~~~~~~~~~~~~~~~~~~~~~~~~ 形势 我有一些漂亮的beafy NSLog调用,用于调试应用程序中更复杂的部分。然而,我最近才了解到这些会影响运行时性能 目标 我想在Xcode中没有实际执行Product>run(又名command-R)的任何运行期间删除我的NSLog调用-特别是在应用商店中部署此功能的情况下,以及在与Xcode断开连接时运行应用程序的情况下(即在街上行走时只需点击图标) 建议的解决方案? 假设我已经创建了一个VIEW_DEBUG的预处理器宏,下面的实现是否会有效地在我上面描述的情况下删除NSLog调用Objective c 目标C:从';分销'/生产构建?,objective-c,ios,ios5,Objective C,Ios,Ios5,更新: 更多信息请点击此处: ~~~~~~~~~~~~~~~~~~~~~~~~ 形势 我有一些漂亮的beafy NSLog调用,用于调试应用程序中更复杂的部分。然而,我最近才了解到这些会影响运行时性能 目标 我想在Xcode中没有实际执行Product>run(又名command-R)的任何运行期间删除我的NSLog调用-特别是在应用商店中部署此功能的情况下,以及在与Xcode断开连接时运行应用程序的情况下(即在街上行走时只需点击图标) 建议的解决方案? 假设我已经创建了一个VIEW_DEBU
<bunch of code>
#ifdef VIEW_DEBUG
NSLog(@"really complex logs entries");
#endif
<even more code>
#ifdef视图\u调试
NSLog(@“非常复杂的日志条目”);
#恩迪夫
这对我来说是一个很难“测试”的问题,所以我想我会吸引更有经验的人
Xcode设置(供参考)
一个常见的解决方案是将以下代码放入前缀文件中(或者您可以创建一个专用类,并根据需要包含它): 在执行调试构建时,Xcode已经为您定义了调试(如屏幕截图所示)VA_ARGS是C99中引入的一种创建方法。
do/while
确保调试日志
即使它什么都不做,也有同样的净语法效果-不要担心无意义的循环,乐观主义者会帮你删除它
然后您可以像使用
NSLog
一样使用DebugLog
。这将完全符合您使用VIEW\u DEBUG
提出的要求,但无需将#ifdef
条件复制粘贴一千次。我在代码中总是使用DLog
,效果非常好
// DLog is almost a drop-in replacement for NSLog
// DLog();
// DLog(@"here");
// DLog(@"value: %d", x);
// Unfortunately this doesn't work DLog(aStringVariable); you have to do this instead DLog(@"%@", aStringVariable);
#ifdef DEBUG
# define DLog(fmt, ...) NSLog((@"%s [Line %d] " fmt), __PRETTY_FUNCTION__, __LINE__, ##__VA_ARGS__);
#else
# define DLog(...)
#endif
// ALog always displays output regardless of the DEBUG setting
#define ALog(fmt, ...) NSLog((@"%s [Line %d] " fmt), __PRETTY_FUNCTION__, __LINE__, ##__VA_ARGS__);
更多信息:我不知道,这有用吗
#define NSLog/
#define DebugLog(…)NSLog(VA_ARGS)也可以工作。另外,您不需要使用do{}而使用GCC或LLVM时,#define DebugLog(…)工作得很好。修复了标记,我对此不负责:#define DebugLog(…)NSLog(uu VA_ARGS)
感谢这两个注释者(尽管我不允许@both)-这就是我盲目复制和粘贴一个有着悠久历史的项目所得到的。上面已经做了更正,我已经将其标记为社区维基,因为现在声明答案的所有权并不准确。@Tommy&crew-对宏来说是新手,所以请确认我的理解:这些#define
调用正在创建一个名为DebugLog(…)
(但它可以被命名为任何名称,对吗?)…
代表我的输入。因此,如果我编写DebugLog(@“test!”)
,在调试模式下它将调出NSLog(@“test!”)
,在非调试模式下,它将调出,而(0)
我的所有NSLog
s-正确吗?(或者,根据MrAnonymous,我甚至需要而(0)
?)--另外,当我的手机与Xcode断开连接,但我正在运行一个“开发”构建时,调试是否会“打开”?@toblerpwn差不多就是这样-你会得到DebugLog(或者你想叫它的任何东西)这与定义调试时键入的NSLog
完全相同,但与键入的while(0)
完全相同,否则什么都不做。这将只取决于构建的类型,而不取决于您的设备是否被拴住,但会阻止您使用日志发布,而且您无论如何都无法对开发构建的发布性能进行准确评估——这就是为什么当您使用工具评测时,它会自动执行发布构建,例如。
// DLog is almost a drop-in replacement for NSLog
// DLog();
// DLog(@"here");
// DLog(@"value: %d", x);
// Unfortunately this doesn't work DLog(aStringVariable); you have to do this instead DLog(@"%@", aStringVariable);
#ifdef DEBUG
# define DLog(fmt, ...) NSLog((@"%s [Line %d] " fmt), __PRETTY_FUNCTION__, __LINE__, ##__VA_ARGS__);
#else
# define DLog(...)
#endif
// ALog always displays output regardless of the DEBUG setting
#define ALog(fmt, ...) NSLog((@"%s [Line %d] " fmt), __PRETTY_FUNCTION__, __LINE__, ##__VA_ARGS__);