用于 NSLog 的“ toString ()”的 Objective-C 等价物是什么?

有没有一个方法,我可以重写在我的自定义类,以便当

      NSLog(@"%@", myObject)

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

57869 次浏览

您可以覆盖 NSObject 的 description 方法:

- (NSString *)description

关于日志记录,我推荐使用这个 博客文章在 Objective-C 中进行更好的日志记录。

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

- (NSString *)description

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

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

把这个添加到照片类的 @implementation:

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

您可以使用两个函数。

- (NSString*)description

当你把你的对象作为,例如 NSLog的一个参数时,它就会显示出来。另一个描述函数是:

- (NSString*)debugDescription

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

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

这将输出现有的声音:

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

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

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

避免重写描述ーー如果此方法在 调试操作时,结果可能无法预测。