【问题标题】:How to pass parameter values to the custom NSLOG如何将参数值传递给自定义 NSLOG
【发布时间】:2013-09-02 17:21:41
【问题描述】:

我正在为我的应用程序开发一个记录器类。NSLog 将仅在调试模式下打印。我已经定制了打印源文件名称、源代码行号、类名称和调用 NSLog() 的方法的 NSLog。 也就是说,我当前的 NSLOG 看起来像 (ClassName MethodName) (SourceFileName:LineNumber) NSLog 输出

现在,我想记录方法名的参数值。如何在 NSLog 中获取这些参数值??? 我希望输出为 (ClassName MethodName) (SourceFileName:LineNumber) (参数值) NSLog 输出

【问题讨论】:

    标签: ios objective-c


    【解决方案1】:

    这样的东西应该可以工作

    #define InstanceLog(fmt, ...) NSLog(@"(%@.%@)(%s:%d) " fmt, NSStringFromClass(self.class), NSStringFromSelector(_cmd), __FILE__, __LINE__, ##__VA_ARGS__)
    

    您可以在 Objective-C 方法中将其用作 NSLog

    InstanceLog(@"simple string");
    InstanceLog(@"%@ %@", @"hello", @"world");
    

    【讨论】:

    • 那不行; fmt 将被插入到结果字符串中,而实际上并没有使用 VA_ARGS 进行格式化。你需要一个额外的 [NSString stringWIthFormat:] 。
    • @bbum 谢谢。得到错误的宏标记:它应该是##,而不是__VA_ARGS__之前的#
    • 那也行不通。您必须单独评估 fmt + VA_ARGS
    • 我编写并使用了几十个这样的宏,它们的工作方式与它们应该的一样。要么你知道一些极端情况会破坏这个,要么你实际上并没有尝试替换它。
    • 我很惊讶特定的 C-ism 与 Objective-C 配合得如此完美。这当然不是我最后一次尝试,但那可能是十多年前的事了。谢谢!
    【解决方案2】:

    没有办法自动内省传递给方法的值。即使在 DEBUG 构建中(优化器不碍事),任何编写代码自省的尝试都说 iVar 将非常复杂(您必须深入研究符号表,提取偏移量等,然后尝试并找到可能在试图抓住它们时被破坏的论点)。

    所以,不,没有办法真正实现自动化。

    不过,一般来说,任何此类日志记录机制都会产生如此庞大的输出量,因此您最好创建(可能仅用于调试)日志记录,该日志记录既可配置又可高度调整到您的应用程序。


    您可以像这样传递参数(感谢@hoha 提供了更简单的版本)。

    #import <Foundation/Foundation.h>
    
    #define FooLog(fmt, ...) NSLog(@"(%s): %@", __PRETTY_FUNCTION__, ## __VA_ARGS__)
    
    @interface Bob:NSObject
    @end
    @implementation Bob
    - (void)yourUncle
    {
        FooLog(@"%@", self);
    }
    @end
    
    int main(int argc, char *argv[]) {
        @autoreleasepool {
            NSString *w = @"World";
            FooLog(@"Hello, %@!", w);
            [[Bob new] yourUncle];
        }
    }
    

    输出:

    2013-09-02 10:51:49.447 Untitled[60967:507] (int main(int, char **)): Hello, World!
    2013-09-02 10:51:49.453 Untitled[60967:507] (-[Bob yourUncle]): <Bob: 0x7fde8840a490>
    

    【讨论】:

      【解决方案3】:


      对于处理自定义日志记录,您可以使用或参考以下链接。
      您可以根据需要自定义 Lumberjack。

      Lumberjack error logging for ios
      Lumberjack error logging tutorial

      【讨论】:

      • Lumberjack 日志框架是第三方框架吧???我不想使用任何第三方框架
      • 是的,但是 Lumberjack 是用于日志记录的开源库,您可以在自己的程序中使用其中的代码。
        否则,您可以点击此链接进行自定义日志记录 link here
      • 谢谢.. 我不知道我的应用程序是否接受开源库。我已在该链接中指定,但我想记录我在问题前面提到的参数值。
      猜你喜欢
      • 2021-08-18
      • 2022-11-25
      • 2015-01-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多