2010-09-09 110 views
0

NSString *myString = @"Johnny Appleseed"NSString *myString = [NSString stringWithString: @"Johnny Appleseed"]有什麼區別?Objective-C字符串差異

哪裏可以使用任何一個?

回答

3

在第一種情況下,您得到一個指向常數NSString的指針。只要你的程序運行,myString將是一個有效的指針。在第二個中,您將創建一個帶有常量字符串的自動發佈NSString對象作爲模板。在這種情況下,myString在當前運行循環結束後不會再指向真實對象。

編輯:正如許多人所指出的,在正常實施stringWithString:只返回一個指向字符串常量,所以一般情況下,你的兩個例子是完全一樣的。 Objective-C允許使用類別替換類的方法,並允許將整個類替換爲class_poseAs。在這些情況下,您可能遇到stringWithString:的非默認實現,它可能與您預期的語義不同。僅僅因爲它碰巧是,默認實現與簡單賦值完成相同的事情並不意味着您應該依賴程序中特定於實現的特定行爲 - 對於您嘗試的特定作業使用正確的案例去做。

+1

-1你試過嗎?我想你會發現stringWithString:帶有一個常量字符串參數只是返回常量字符串。 – JeremyP 2010-09-10 09:45:45

+0

@JeremyP,如果你看下面的@ quixoto的回答下的討論,還有更多的解釋。我想我應該編輯這個清晰。 – 2010-09-10 15:51:23

0

在實踐中,沒有什麼。除非你有特殊的理由,否則你永遠不會使用第二種形式。我現在想不出任何。

(請參閱卡爾的技術差異答案。)

+0

實際上,每個對象的生命週期都有明確的區別,當'myString'指向一個真實的對象,並且它沒有。 – 2010-09-09 22:58:17

+0

@carl:它們都產生相同的指針值。由於二者都指向內存中完全相同的數據,因此在生命週期中沒有差異。 – tidwall 2010-09-09 23:09:39

+0

@jojaba - 如果有一個類似'NSString'的類或者某人已經在一個類中覆蓋'stringWithString',可能不會有這樣的假設。 – 2010-09-09 23:10:32

5

其他答案這裏是正確的。 使用+stringWithString:的情況是獲取可能是可變的字符串的不可變副本。

2

除了語法和非常非常小的性能差異,沒有什麼。兩者都產生完全相同的指針,完全相同的對象。

使用第一個示例。它更容易閱讀。