正如这个答案中所指出的,字符串文字是不可变的字符串对象,并在编译时获取它们的地址 - 所以您不需要在运行时创建相同文字字符串的多个实例。
NSString *myString = @"Hello";
所以在这里我们只是将 myString 分配给指向字符串字面量的指针。
NSString *myString = [NSString stringWithString:@"Hello"];
第二行使用便利构造函数创建对象,但是当我们在这里处理不可变对象时,它会产生与字符串字面量相同的指针值 - 所以你会得到与第一个变体相同的结果(尽管可能执行一些额外的方法调用)。
所以看起来你提到的变体做同样的事情,但第二个也可能执行一些额外的调用。
说明发生了什么的小样本:
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