使用与@“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"];
其中textField
是UITextField
, text
属性是NSString
。 当然,他们都工作。 我知道使用参数时最后两个的区别。 但是可以说我们只对这个用法感兴趣。
问题:
- 为了做这样的任务,为什么我不应该总是使用第一个?
- 比较后两者,这两者的编译和/或运行时间是否有区别? 而为什么我应该使用
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中时,可以使用后者。
而且这个问题在其他地方已经被无数次的回答了。