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


170

有没有可以在自定义类中覆盖的方法,以便

      NSLog(@"%@", myObject) 

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

Answers:


250

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

- (NSString *)description

这是一个示例实现(由于grahamparks):

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

5
请注意,如果您使用的是CoreData,该description属性将被保留 ...并将提供有用的调试信息!在这种情况下,您需要提供自己的唯一方法名称。
五子雀

难道debugDescription还保留?虽然我认为DebugDescription应该由像LLDB这样的调试器使用。
MaddTheSane 2014年

36

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

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

24

您可以覆盖NSObject的描述方法:

- (NSString *)description

关于日志记录,我推荐这篇博客文章,以便更好地在Objective-C中进行日志记录。


4
这不是静态方法吗?我希望此操作对象而不是类。例如,如果我有一个“照片”类,其字段为“名称”和“作者”,我希望NSLog打印这些字段,因为它们是在对象中分配的。
乔治·阿姆霍尔德

2
是的-发现得很好-我按错了键。当证明阅读我的答案时,我显然应该更加注意。值得庆幸的是,有人注意到了球:-)
teabot

13

您可以使用两种功能。

- (NSString*)description

当您将对象作为IE的参数放置时,这将显示NSLog。另一个描述功能是:

- (NSString*)debugDescription

po anInstanceOfYourClass在调试命令窗口中执行此操作时,将调用此函数。如果您的类没有debugDescription函数,那么description它将被调用。

请注意,基类NSObject确实已description实现,但它是一个基本的系统:它仅显示对象的地址。这就是为什么我建议您description在要从中获取信息的任何类中实现的原因,尤其是description在代码中使用该方法的情况下。如果您确实description在代码中使用过,建议您也实施debugDescription,也要使它debugDescription更加冗长。


1

这将输出可用的声音:

    NSLog((@"speechVoices:%", [[AVSpeechSynthesisVoice speechVoices] description] ));
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.