【问题标题】:What is the Objective-C equivalent for "toString()", for use with NSLog?与 NSLog 一起使用的“toString()”的 Objective-C 等效项是什么?
【发布时间】:2010-11-09 10:30:12
【问题描述】:

有没有可以在我的自定义类中重写的方法,以便在何时

      NSLog(@"%@", myObject) 

被调用,它将打印我的对象的字段(或我认为重要的任何内容)?我想我正在寻找 Java 的 toString() 的 Objective-C 等价物。

【问题讨论】:

    标签: objective-c tostring nslog


    【解决方案1】:

    是description的实例方法,声明为:

    - (NSString *)description
    

    这是一个示例实现(感谢 grahamparks):

    - (NSString *)description {
       return [NSString stringWithFormat: @"Photo: Name=%@ Author=%@", name, author];
    }
    

    【讨论】:

    • 请注意,如果您使用的是 CoreData,description 属性 is reserved ... 将提供有用的调试信息!在这种情况下,您需要提供自己的唯一方法名称。
    • debugDescription 也保留吗?虽然我认为DebugDescription 应该被 LLDB 之类的调试器使用。
    【解决方案2】:

    将此添加到您的照片类的@implementation:

    - (NSString *)description {
       return [NSString stringWithFormat:@"Photo: Name=%@ Author=%@",name,author];
    }
    

    【讨论】:

      【解决方案3】:

      你可以重写 NSObject 的描述方法:

      - (NSString *)description
      

      关于日志记录,我推荐blog post 以便更好地在 Objective-C 中进行日志记录。

      【讨论】:

      • 这不是静态方法吗?我希望它对对象而不是类进行操作。例如,如果我有一个“照片”类,包含字段“名称”和“作者”,我希望 NSLog 打印这些字段,因为它们是在对象中分配的。
      • 是的 - 很明显 - 我按错了键。在校对我的答案时,我显然应该更加注意。谢天谢地,有人盯着球看:-)
      【解决方案4】:

      您可以使用两个功能。

      - (NSString*)description
      

      这将在您将对象设置为 I.E. 时显示NSLog 的参数。另一个描述函数是:

      - (NSString*)debugDescription
      

      当您在调试命令窗口中执行po anInstanceOfYourClass 时,将调用它。如果你的类没有debugDescription 函数,那么只会调用description。

      请注意,基类NSObject 确实实现了description,但它相当简单:它只显示对象的地址。这就是为什么我建议您在要从中获取信息的任何类中实现description,尤其是如果您在代码中使用description 方法。如果你确实在代码中使用了description,我建议你也实现debugDescription,同时让debugDescription 更加冗长。

      【讨论】:

        【解决方案5】:

        这将输出可用的声音:

            NSLog((@"speechVoices:%", [[AVSpeechSynthesisVoice speechVoices] description] ));
        

        【讨论】:

          【解决方案6】:

          我认为应该强调来自@Nuthatch 的关于用 CoreData 覆盖“描述”(即继承 NSManagedObject 的类)的评论

          https://developer.apple.com/documentation/coredata/nsmanagedobject?language=objc

          避免覆盖描述 - 如果此方法在 调试操作,结果可能无法预料。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2018-09-02
            • 2019-06-26
            • 2010-11-27
            • 1970-01-01
            • 2014-05-31
            • 1970-01-01
            • 1970-01-01
            • 2016-10-28
            相关资源
            最近更新 更多