2010-06-16 105 views
3
  1. NSString *myString = @"Hello";這兩種創建NSStrings的方式有什麼區別?

  2. NSString *myString = [NSString stringWithString:@"Hello"];

據我所知,使用方法(1)產生一個指向一個字符串文字被定義爲靜態存儲器(並且不能被釋放),並且使用( 2)創建一個將自動發佈的NSString對象。

  • 正在使用方法(1)不好?
  • 有什麼主要的區別?
  • 有沒有你想要使用(1)的任何實例?
  • 是否有性能差異?

P.S.我已經在Stack Overflow上進行了廣泛的搜索,雖然在同一主題上有問題,但他們都沒有回答我上面發佈的問題。

回答

5

正如在this answer中指出的那樣,字符串文字是不可變的字符串對象,並在編譯時得到它們的地址 - 因此您不需要在運行時創建同一文字字符串的多個實例。

NSString *myString = @"Hello"; 

因此,我們只是將myString分配給指向字符串的指針。

NSString *myString = [NSString stringWithString:@"Hello"]; 

第二行中使用便利的構造函數創建對象,但因爲我們這裏處理不可變對象它會導致相同的指針值字符串字面 - 讓您得到相同的結果1變型(雖然可能執行一些額外的方法調用)。

因此,您提到的變體似乎也是如此,但第二個變體也可能會執行一些額外的調用。

出小樣本會發生什麼:

NSString* tString = @"lala"; 
NSString* tString2 = @"lala"; 
NSString* tString3 = [NSString stringWithString:@"lala"]; 
NSString* tString4 = [NSString stringWithFormat:@"%@", @"lala"]; 

NSLog(@"%p %d", tString, [tString retainCount]); 
NSLog(@"%p %d", tString2, [tString2 retainCount]); 
NSLog(@"%p %d", tString3, [tString3 retainCount]); 
NSLog(@"%p %d", tString4, [tString4 retainCount]); 

輸出:

0xd0418 2147483647 
0xd0418 2147483647 
0xd0418 2147483647 
0x50280e0 1 
相關問題