2010-05-29 108 views
3

好吧,所以我有一個方法,輸入NSString作爲輸入,對此字符串的內容進行操作,並返回處理的字符串。所以聲明:我應該返回一個NSMutableString返回NSString的方法

- (NSString *) processString: (NSString *) str; 

的問題:我應該回報,我作爲我的「工作」緩衝的NSMutableString實例,或者我應該創建圍繞可變一個新的NSString,並返回?

所以我應該這樣做:

- (NSString *) processString: (NSString *) str 
{ 
    NSMutableString *work = [NSMutableString stringWithString: str]; 
    // process 'work' 
    return work; 
} 

或者這樣:

- (NSString *) processString: (NSString *) str 
{ 
    NSMutableString *work = [NSMutableString stringWithString: str]; 
    // process 'work' 
    return [NSString stringWithString: work]; // or [work stringValue]? 
} 

第二個讓我返回字符串的另一個副本,除非NSString確實喜歡副本上聰明事-修改。但是,第一個是在理論上,返回調用者可以稍後去修改的東西。我不在乎他們是否這樣做,因爲弦是他們的。但是,有沒有正確的理由偏好後者的形式?而且,是stringWithString還是stringValue優於其他?

回答

6

完全取決於你需要如何防守。

您的代碼的客戶端可以測試可變性沒有合理的方法。因此,客戶端可以從NSString轉換爲NSMutableString並且突然實現字符串的無編譯器警告可變性的合理方式。

所以,只要你相信你的客戶,你也可以返回可變字符串(作爲NSString)。即使客戶端做了一些愚蠢的事情,並且改變了它,編譯器的警告也會被詛咒,沒有任何事情會發生。

它在哪裏確實問題是當您返回某些不應該在外部進行變異的對象的可變後備存儲區時。在這種情況下,客戶端可能會忽略編譯器警告和/或強制轉換爲可變類型,並且完全禁止您的對象。

或者,更爲巧妙的是,客戶端可能會獲取對所謂的不可變返回類型的引用,並保持它足夠長的時間,以便稍後發生變化,從而使其引用處於令人驚訝的狀態。

最佳實踐:計算並返回瞬態值時,可變性無關緊要。在返回一個內部可變存儲的引用時,最好創建一個不可變的副本。