我想比较以下简单的作业:
...
@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:
?
最佳答案
始终尝试做感觉自然的事情。如果你要分配一个常量字符串,那么就这样做,即第一个选项。 @"..."
字符串是非常高效的常量,不需要进行内存管理,因此在有意义的情况下使用它们。
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
如您所见,每次都会创建一个新字符串,因为您提供的字符串只是用于处理以下替换变量的格式字符串,因为您没有避免 stringWithFormat:
除非你需要它。
(显然所有地址都是示例...)
关于objective-c - 使用 [NSString stringWithString : @"some string"] versus @"some string" 的优缺点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8275131/