正如在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