【问题标题】:generalize call to NSLog概括调用 NSLog
【发布时间】:2011-08-24 20:55:03
【问题描述】:

我想概括调用 NSLog 并避免在完成调试时注释掉调用。

我有:

#define USE_ADLog 0
#define USE_RPLog 0
#define USE_DLLog 1

void ConsoleADLog(NSString *message, ...);
void ConsoleRPLog(NSString *message, ...);
void ConsoleDLLog(NSString *message, ...);

例如:

void ConsoleADLog(NSString *message, ...) {

#if (USE_ADLog)
    va_list optionalArgs;

    va_start(optionalArgs, message);   // after the parm = message
    va_end(optionalArgs);

    NSLog(message, optionalArgs);
#endif
}

到目前为止,一切都很好......但是,例如,只要我打电话:

   ConsoleDLLog(@"parm1 = %@, parm2 = %@", parm1, parm2);

哪个调用在辅助线程中,我炸了。我想?? va_start、va_end 是线程安全的。

...还是问题 %@...我知道 %f 有效???

显然不是!,那么我如何让它们线程安全...普通 ole

NSLog(@"whatever %@", whateverParm)

有效,但不是上面的功能。

谢谢,

【问题讨论】:

  • 有几件事我不明白。为什么在使用它之前在 va_end 中释放 optionalArgs ?你不应该用msg = [[[NSString alloc] initWithFormat:message arguments:optionalArgs] autorelease]; va_end(optionalArgs); 之类的东西保存它,然后用NSLog 来保存味精吗?你真的想要 ASL 的 NSLog 吗?你可以改用 fprintf。

标签: iphone objective-c cocoa macos nslog


【解决方案1】:

这就是为什么许多可变参数函数包含接受va_lists 的变体。

NSLogv

【讨论】:

  • 阿门 ... 使用 NSLogv(@"whatever %@, whateverParm) 并且一切都变好了...但是,既然 NSLog 只是调用 NSLogv,为什么不在这里使用 NSLog 工作。我知道“我们的目的不是解释为什么,等等等等。”……但是为什么?
  • 在此处接受的答案中查看 QA:stackoverflow.com/questions/3143906/…
  • 谢谢,贾斯汀...为什么?来自 Yuji “你不能。一旦 ... 转换为 va_list,它只能传递给接受 va_list 的函数或方法,而不是接受可变数量参数的函数/方法。”跨度>
  • vas 是不透明的并且是实现定义的。此外,va 初始化操作使用本地地址 - 没有显式存储来指定(通过参数传递给函数)用户定义的地址(例如,外部函数在 valist 中的第一个参数的地址)。如果您想转发此信息,您可以通过向所有可变参数函数添加参数来实现,但这比添加 va_list 变体 (imo) 更复杂。
【解决方案2】:
#if DEBUG == 0
#define DebugLog(...)
#elif DEBUG == 1
#define DebugLog(...) NSLog(__VA_ARGS__)
#endif

然后使用DebugLog(@"Uh oh: %@", someArgument); 调用它。如果DEBUG 设置为1,预处理器将发出NSLog(@"Uh oh: %@", someArgument);。如果设置为0,则不会发出任何内容。

【讨论】:

  • 请原谅我,因为我只是不记得细节......但是,对于 Xcode 4(不是 3),带有空等效项的 #define DebugLog(...) 行产生了某种(外星人)对某事的警告。该死,我希望我能记住!
猜你喜欢
  • 1970-01-01
  • 2021-12-09
  • 1970-01-01
  • 2011-07-26
  • 1970-01-01
  • 2017-05-06
  • 2017-05-11
  • 2019-12-20
  • 1970-01-01
相关资源
最近更新 更多