在可可中覆盖描述或stringValue?

时间:2009-12-14 10:23:31

标签: cocoa override

我希望在Cocoa中有一个对象的描述性字符串。我正在考虑覆盖description方法或stringValue方法。哪个更好,为什么?我能找到的唯一指南是in here陈述

  

不鼓励你覆盖描述。

这确实是你建议的吗?任何其他首选的覆盖点?

4 个答案:

答案 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的调试类别,它会转储我能想到的每个属性。如果我遇到一个令人讨厌的错误我只是包含该类别,然后我可以在调试器控制台中看到有关每个视图的所有内容。