2009-11-17 41 views
5

ObjectiveC爲什麼提供NSString類和NSMutableString子類,而不僅僅提供NSMutableString?是不是一個NSString等同於「常量NSMutableString」?同時擁有NSMutableString和NSString的目的是什麼?

在C++中,只有一個字符串類std :: string,如果需要常量,則聲明一個const std:string。

我很想知道爲什麼我不應該在任何地方都使用NSMutableString,並且從來不打擾NSString?必須有一個原因,或者語言設計者不會同時提供。也許它佔用較少的存儲空間或什麼?

回答

5

這兩個類的原因與您有時使用std :: string並且有時使用const std :: string的原因相同。然而,與C++不同,Objective-C沒有const方法,所以它們將const-和non-const-方法分開爲兩個不同的類。這也在很多核心類中看到,例如NSArray(NSMutableArray),NSDictionary(NSMutableDictionary)等。

0

我想說的一般規則是「不要使用其目的是提供您不需要的功能的類」。如果您需要直接更改字符串的內容,請使用NSMutableString。如果不是,請使用NSString。就規模和佔用的堆空間而言,這些類本身應該非常相似。

+0

我知道使用哪個類。我的問題是爲什麼語言設計師選擇將功能分爲兩類? – progrmr 2009-11-17 15:29:18

+0

因爲拆分功能允許編譯器和運行時在不需要附加功能的情況下提供更高的性能。 – 2009-11-17 18:58:54

5

這是非常可能的,甚至有可能存在優化,只有當字符串是不可改變的。

實際上運行

NSString *A = @"Bob"; 
NSString *B = @"Bob"; 
在調試器

立即顯示,它們都指向相同的字符串。其實

NSString *C = [NSString stringWithString:@"Bob"]; 
NSString *D = [A copy]; 

都指向相同的內存地址以及。同時

NSString *E = [NSMutableString stringWithString:@"Bob"]; 

指向不同的字符串。

所以是的,在某些情況下使用NSString更有效率。一般而言,可可有助於返回一個字符串的新副本,而不是一個已編輯的副本。但是,我無法真正爭辯說你不應該在任何地方使用可變字符串,但它似乎違背了框架的一般準則。

在我自己的工作中,我傾向於只使用可變變體,我需要直接編輯東西。這只是從C/C++風格的所有東西都可以改變而來的,除非你需要一個const,除非你需要可變性,否則一切都是const的。

+0

'NSString * D = [E copy];'它會指向'E'還是指向另一個新字符串? – 2016-08-04 09:43:36

0

我認爲不可變字符串的用法是編譯器的一個提示,它可以通過知道它不會改變來執行優化。

+0

正如我的測試顯示它也影響運行時的行爲方式。 – 2009-11-17 15:39:16

相關問題