使用与@“some string”的优点和缺点

我想比较以下简单的作业:

... @property(nonatomic,retain) UITextField *textField; ... self.textField.text = @"some string"; self.textField.text = [NSString stringWithString:@"some string"]; self.textField.text = [NSString stringWithFormat:@"some string"]; 

其中textFieldUITextFieldtext属性是NSString 。 当然,他们都工作。 我知道使用参数时最后两个的区别。 但是可以说我们只对这个用法感兴趣。

问题:

  1. 为了做这样的任务,为什么我不应该总是使用第一个?
  2. 比较后两者,这两者的编译和/或运行时间是否有区别? 而为什么我应该使用stringWithString:如果不是呢?

为了做这样的任务,为什么我不应该总是使用第一个?

应该总是使用你描述的情况中的第一个。 第二和第三种情况可能会复制常量string,但是UITextField的text属性指定为复制提供的string。 制作一个常量string的副本是没有意义的,因为UITextField的-setText:可以复制该副本。

比较后两者,这两者的编译和/或运行时间是否有区别? 而为什么我应该使用stringWithString:如果不是呢?

我的理解是, -stringWithFormat:将始终创build一个新的string,而-stringWithString:可能不(对于一个常量string可能不)。 上面的hypercrypt的结果在这方面是相当明显的; 如果你想探索更多,你可以尝试使用可变string进行相同的testing。

总是尝试做自然的事情。 如果你正在分配一个常量string,那就这样做,即第一个选项。 @"..."string是非常有效的常量,不需要进行内存pipe理,所以如果有意义的话就使用它们。

 NSLog(@"%p", @"XX"); NSLog(@"%p", @"XX"); NSLog(@"%p", @"XX"); 

结果是:

 0xa2424 0xa2424 0xa2424 

即它们在记忆中都是同一个物体。

 NSLog(@"%p", [NSString stringWithString:@"XX"]); NSLog(@"%p", @"XX"); NSLog(@"%p", [NSString stringWithString:@"XX"]); 

还导致:

 0xa2424 0xa2424 0xa2424 

正如你所看到的,两个对象之间没有区别,因此使用-stringWithString:只是一个额外的消息发送。 话虽如此,开销通常不足以产生影响,所以不应该是一个大问题。 就个人而言,我会用方法一,因为没有使用方法二的好处,它只是额外的代码。

然而,

 NSLog(@"%p", [NSString stringWithFormat:@"XX"]); NSLog(@"%p", [NSString stringWithFormat:@"XX"]); NSLog(@"%p", [NSString stringWithFormat:@"XX"]); 

结果是:

 0x7f86730 0xf8479b0 0x8a4cdb0 

正如你所看到的,每次创build一个新的string,因为你提供的sting只是一个格式string,用来处理下面的replacevariables,因为你没有避免stringWithFormat:除非你需要它。

(显然,所有的地址都是例子…)

为了做这样的任务,为什么我不应该总是使用第一个?

对于这样的任务,你总是使用第一个,而不是最后两个。

为什么我应该使用stringWithString:如果不是的话呢?

你的直觉是正确的。 在大多数情况下-stringWithString:具有可疑的价值。 它主要用于NSMutableString ,它是NSString一个子类。

例如:

 NSMutableString* myString = [NSMutableString stringWithString:@"Foo"]; [myString appendString:@"Bar"]; 

如果要将NSMutableString转换为NSString,也可以使用它,否则确保处理NSString实例。 例如:

 - (void):setMyString:(NSString*)newString { [_myString release]; _myString = [[NSString stringWithString:newString] retain]; } 

这是确保_myString ivar指向NSString实例而不是NSMutableString实例的一种方法。 而newString实例只在必要时被复制。

但是,大多数开发人员只会使用_myString = [newString copy]; 在这种情况下。

如果您使用第一个或第二个string,我不认为这很重要。 但是我通常使用第二个。

在第二个和第三个的情况下,如果你有另一个variables,你想在你的string中包含,那么你使用stringWithFormat之一。 否则,使用stringWithString。

 int number = 5; NSString *str = [NSString stringWithFormat:@"Number is: %i", number]; // Str is "Number is: 5" 

您将使用stringWithString的情况:

 NSString *myName = [NSString stringWithString:@"FN LN"]; // myName is "FN LN" 

当没有其他variables包含在string中时,可以使用后者。

而且这个问题在其他地方已经被无数次的回答了。