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