2009-12-14 58 views
5

我想爲可可中的對象提供描述性字符串。我正在考慮重寫描述方法或stringValue方法。哪個更好,爲什麼?我能找到的唯一指南是in here陳述覆蓋可可中的描述或stringValue?

你不鼓勵從重寫描述。

這確實是你會建議的嗎?任何其他首選的覆蓋點?

+1

你的鏈接是關於核心數據的文檔 - 你想重寫NSManagedObject的描述方法還是其他? – 2009-12-14 10:26:19

+0

我不這麼認爲 - 它是一個NSObject子類,它保存空間邊界框的數據以及其中的一些操作。字符串描述基本上是逗號分隔的左下角和右上角座標列表。 – mvexel 2009-12-14 10:36:53

回答

5

description是要走的路,這就是它被稱爲供應對象的字符串表示。

- (NSString*)description 
{ 
    return [NSString stringWithFormat:@"%@, %@; %@", a, b, c]; 
} 

我相信Hillegass的書也是這樣建議的。

+0

謝謝,因爲Hillegass提醒;) – mvexel 2009-12-14 10:45:28

7

我個人在幾乎所有的子類中覆蓋了description。我想,就像Tom Duckering在他的評論中寫道,你的引用只適用於託管對象。

- (NSString *)description 
{ 
    return [NSString stringWithFormat:@"%@ <%p>", NSStringFromClass([self class]), self]; 
} 
2

您也可以覆蓋調試器調用的[NSObject debugDescription]。在調試器中使用「print to console」時,這就是所謂的。你也可以直接在NSLog中調用它。

默認情況下,在大多數類debugDescription只是調用description,但你可以讓他們返回單獨的字符串。這是載入輸出細節的好地方。

類別是停放自定義類和現有類的方法的好地方。這是特別有用的,因爲您可以將該類別包含在調試版本中,但在版本中將其排除。如果該類別不存在,代碼會調用默認的類方法。

我有一個UIView的調試類別,它拋出了我能想到的每個屬性。如果我遇到了一個令人討厭的錯誤,那麼我只包含這個類別,然後我可以在調試器控制檯中看到關於每個視圖的所有信息。

4

要從另一個方向回答你的問題,stringValue是完全不同的 - 它沒有描述接收者,它是它的一個屬性。您的自定義description甚至可能包含stringValue,或者如果它很長,可以摘錄它。

一個關鍵的區別是stringValue通常是一個可變屬性(請參閱,例如,NSControl的屬性),而description始終是一個不可變屬性,根據需求計算。