我希望在Cocoa中有一个对象的描述性字符串。我正在考虑覆盖description方法或stringValue方法。哪个更好,为什么?我能找到的唯一指南是in here陈述
不鼓励你覆盖描述。
这确实是你建议的吗?任何其他首选的覆盖点?
答案 0 :(得分:7)
我亲自在我创建的几乎所有子类中覆盖description
。我想,就像Tom Duckering在评论中写道,你的引用只适用于托管对象。
- (NSString *)description
{
return [NSString stringWithFormat:@"%@ <%p>", NSStringFromClass([self class]), self];
}
答案 1 :(得分:5)
description
是要走的路,就是它被称为提供对象的字符串表示。
- (NSString*)description
{
return [NSString stringWithFormat:@"%@, %@; %@", a, b, c];
}
我相信Hillegass的书也是如此。
答案 2 :(得分:4)
要从另一个方向回答你的问题,stringValue
是完全不同的东西 - 它没有描述接收者,它是它的一个属性。您的自定义description
甚至可能包含stringValue
,如果篇幅很长,也可能包含该摘录。
一个关键的区别是stringValue
通常是一个可变属性(例如,参见NSControl的属性),而description
总是一个不可变的属性,根据需要计算。
答案 3 :(得分:2)
您还可以覆盖调试器调用的[NSObject debugDescription]。这是在调试器中使用“print to console”时调用的内容。您也可以直接在NSLog中调用它。
默认情况下,大多数类debugDescription
只调用description
,但您可以让它们返回单独的字符串。这是一个用细节加载输出的好地方。
类别是为自定义类和现有类停放方法的好地方。这特别有用,因为您可以在调试版本中包含该类别,但在发行版中将其排除。如果该类别不存在,则代码将调用默认的类方法。
我有一个UIView的调试类别,它会转储我能想到的每个属性。如果我遇到一个令人讨厌的错误我只是包含该类别,然后我可以在调试器控制台中看到有关每个视图的所有内容。