2010-06-16 99 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