ChatGPT解决这个技术问题 Extra ChatGPT

与 NSLog 一起使用的“toString()”的 Objective-C 等效项是什么?

是否有一种方法可以在我的自定义类中覆盖,这样当

      NSLog(@"%@", myObject) 

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


z
zakovyrya

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

- (NSString *)description

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

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

请注意,如果您使用的是 CoreData,description 属性 is reserved ...将提供有用的调试信息!在这种情况下,您需要提出自己的唯一方法名称。
debugDescription 是否也保留?虽然我认为 DebugDescription 应该由像 LLDB 这样的调试器使用。
g
grahamparks

将此添加到您的 Photo 类的 @implementation

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

t
teabot

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

- (NSString *)description

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


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

您可以使用两个功能。

- (NSString*)description

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

- (NSString*)debugDescription

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

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


g
grigb

这将输出可用的声音:

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

E
Erkki Nokso-Koivisto

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

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

避免覆盖描述 - 如果此方法在调试操作期间触发错误,则结果可能无法预测。