使用[NSString stringWithString:@"some string"]与@"some string"的优点和缺点

d.e*_*nis 2 cocoa cocoa-touch objective-c nsstring ios

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

...
@property(nonatomic,retain) UITextField *textField;
...

self.textField.text = @"some string";
self.textField.text = [NSString stringWithString:@"some string"];
self.textField.text = [NSString stringWithFormat:@"some string"];
Run Code Online (Sandbox Code Playgroud)

textFielda UITextFieldtexta属性在哪里NSString?当然所有这些都有效.我知道使用参数时最后两个的区别.但是让我们说我们只对这种用法感兴趣.

问题:

  1. 为了做这种任务,我为什么不总是使用第一个?
  2. 比较后两个,这两个的编译和/或运行时间有什么不同吗?stringWithString:如果没有,我为什么要使用呢?

hyp*_*ypt 12

总是尽量做自然感觉.如果你要分配一个常量字符串,那么就这样做,即第一个选项.@"..."字符串是非常有效的常量,不需要进行内存管理,因此如果有意义则使用它们.

NSLog(@"%p", @"XX");
NSLog(@"%p", @"XX");
NSLog(@"%p", @"XX");
Run Code Online (Sandbox Code Playgroud)

结果是:

0xa2424
0xa2424
0xa2424
Run Code Online (Sandbox Code Playgroud)

即它们在记忆中都是相同的对象.

NSLog(@"%p", [NSString stringWithString:@"XX"]);
NSLog(@"%p", @"XX");
NSLog(@"%p", [NSString stringWithString:@"XX"]);
Run Code Online (Sandbox Code Playgroud)

还导致:

0xa2424
0xa2424
0xa2424
Run Code Online (Sandbox Code Playgroud)

从中可以看出,两个对象之间没有区别,因此使用-stringWithString:只是一个额外的消息要发送.话虽如此,开销通常不足以产生差异,所以无论如何都不应该是一个大问题.我个人会选择方法一,因为没有使用方法二的好处,它只是额外的代码.

然而,

NSLog(@"%p", [NSString stringWithFormat:@"XX"]);
NSLog(@"%p", [NSString stringWithFormat:@"XX"]);
NSLog(@"%p", [NSString stringWithFormat:@"XX"]);
Run Code Online (Sandbox Code Playgroud)

结果是:

0x7f86730
0xf8479b0
0x8a4cdb0
Run Code Online (Sandbox Code Playgroud)

如您所见,每次创建一个新字符串,因为您提供的sting只是一个格式字符串,用于处理以下替换变量,因为stringWithFormat:除非您需要它,否则无法避免.

(显然所有地址都是例子......)

  • 更重要的是,`stringWithFormat:`采用格式字符串,就像`NSLog`一样.您不希望为其第一个参数传递任何字符串,该参数不是特定的格式字符串. (3认同)

Dar*_*ren 6

为了做这种任务,我为什么不总是使用第一个?

对于那种任务,你总是使用第一个,而不是最后两个.

我为什么要使用stringWithString:如果不是的话?

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

例如:

NSMutableString* myString = [NSMutableString stringWithString:@"Foo"];
[myString appendString:@"Bar"];
Run Code Online (Sandbox Code Playgroud)

如果要将NSMutableString转换为NSString,或者确保您正在处理NSString实例,也可以使用它.例如:

- (void):setMyString:(NSString*)newString 
{
    [_myString release];
    _myString = [[NSString stringWithString:newString] retain];
}
Run Code Online (Sandbox Code Playgroud)

这是确保_myStringivar指向NSString实例而不是NSMutableString实例的一种方法.并且newString仅在必要时复制实例.

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