4
  1. NSString *myString = @"Hello";

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

我知道使用方法(1)创建一个指向定义为静态内存(并且不能被释放)的字符串文字的指针,并且使用(2)创建一个将被自动释放的 NSString 对象。

  • 使用方法(1)不好吗?
  • 主要区别是什么?
  • 是否有任何您想使用 (1) 的实例?
  • 有性能差异吗?

PS 我在 Stack Overflow 上进行了广泛的搜索,虽然有关于同一主题的问题,但他们都没有回答我上面发布的问题。

4

1 回答 1

6

正如这个答案中所指出的,字符串文字是不可变的字符串对象,并在编译时获取它们的地址 - 所以您不需要在运行时创建相同文字字符串的多个实例。

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
于 2010-06-16T11:15:59.517 回答