ios - 标记 Xcode 以简单地不编译某些方法?

标签 ios objective-c xcode compiler-construction c-preprocessor

我有一个特殊的日志记录函数,我们称它为 JLog(),我编写它是为了跟踪日志记录数据,但仅限于在模拟器和我的测试设备上进行测试时。我在我的 Xcode 项目中设置了一个 DEBUG 预处理器标志,只为开发模式设置,而不是在生产模式中设置。 JLog() 使用它来知道是否输出日志消息。它看起来有点像这样:

void JLog(NSString *message) {
#ifdef DEBUG
    NSLog(@"%@", message);
#endif
}

我使用它而不是用 #ifdef DEBUG 包装我所有的 NSLog() 调用 - 它使我的代码更易于阅读并且更不容易出现错误。

问题是,即使应用程序在生产环境中不打印日志消息,它仍然需要构建传递给 JLog() 的消息 - 这有时很昂贵并且经常使用很多内存。例如,如果我有这样的代码:

NSError *error = <something>;
JLog([NSString stringWithFormat:@"Error: %@", error);

... 然后应用程序被迫分配一个 NSString,将 NSString 化版本的错误插入其中,并将其传递给 JLog() - 只是什么也不做。这对我来说非常浪费。

我想做的是以某种方式指示 Xcode 在生产环境中不编译 JLog() 代码。那样的话,像上面构建错误消息的例子这样的代码无论如何都不会打印到日志中,根本不需要调用。我该怎么做?

最佳答案

替换你的

void JLog(NSString *message) {
#ifdef DEBUG
    NSLog(@"%@", message);
#endif
}

#ifdef DEBUG
void JLog(NSString *message) {
    NSLog(@"%@", message);
}
#else
#define JLog(args) {}
#endif

关于ios - 标记 Xcode 以简单地不编译某些方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20329877/

相关文章:

ios - iPhone UITableView : How to remove the spacing between sections in group style table?

ios - 在 Xcode 中禁用/启用按钮

ios - 在 -[NSURLResponse allHeaderFields] 中崩溃

ios - 使用 Core Data 和 AFIncrementalStore 时重新格式化 JSON 属性

asp.net - Apple Itms 服务 ://Problems in ASP. NET

ios - MKMapView 未正确删除注释?

ios - 在 reloadData 上禁用 UICollectionView 动画

ios - 将 UITapGestureRecognizer 添加到具有范围的 NSAttributed 文本

ios - 顶部栏在 iPhone 5 中可见但在 iPhone 6 中不可见

xcode - OCUnit 测试失败,但 Xcode Log Navigator 显示没有问题