【问题标题】:What happens to Console.WriteLine calls in Xamarin.iOS release builds?Xamarin.iOS 发布版本中的 Console.WriteLine 调用会发生什么情况?
【发布时间】:2016-08-28 19:38:31
【问题描述】:

在使用 XCode 开发 iOS 应用程序时,您可以使用 NSLog 调用将信息写入控制台以进行调试。在 Xamarin.iOS 中,同样可以使用 Console.WriteLine 来完成。

在没有附加调试器的情况下运行应用的发布版本时,这些调用毫无用处。所以我想用预处理器指令排除它们:

#if DEBUG
Console.WriteLine("foo");
#endif

这样调用甚至在发布版本中都不存在。我很欣赏这可能是微优化 - 但我很好奇 Xamairn 是否已经这样做了,所以没有必要这样做?

【问题讨论】:

  • "在 Xamarin.iOS 中,同样可以使用 Console.WriteLine" Console.WriteLine 有时会调用 NSLog。有时(比如当你在调试器下运行时)Console.WriteLine 会做其他事情。认为 NSLog 和 Console.WriteLine 相同,最终会让你感到痛苦。
  • @JamesMoore 你能详细说明什么是“其他东西”吗?

标签: ios debugging xamarin console


【解决方案1】:

Console 输出不会在 iOS 发布版本中删除。

仅供参考:Xcode 也不会“自动”从 Obj-C/Swift“发布”代码中删除 NSLogprint。 (如果需要,您通常定义一个全局预处理器宏来将它们全部删除......)

您的选择有很多...包括:

  • DEBUG 预处理器,如您在问题中所示。

  • 使用System.Diagnostic.Debug.WriteLine:

由于应用了 [Conditional("DEBUG")] 属性,编译器将删除任何对 Debug.* 的调用。

  • 创建您自己的“Logger”类作为stdout 编写器和[Conditional("DEBUG")] 它的包装器

  • 使用Fody 并重新编织程序集以删除/NOP/重定向WriteLine

    • 我这样做是为了将调用重定向到内部日志中,并在发生崩溃或用户统计请求时,将此日志转发到我们的崩溃报告服务器。
  • 等等……

参考:Xamarin 的 NSLogWriter 助手类

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-06-02
    • 1970-01-01
    • 1970-01-01
    • 2011-02-02
    • 2021-01-24
    • 2011-07-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多