objective-c - 使用 [NSString stringWithString : @"some string"] versus @"some string" 的优缺点

标签 objective-c ios cocoa-touch cocoa nsstring

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

...
@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 是一个 UITextFieldtext 属性是一个 NSString。当然,它们都可以工作。我知道最后两个在使用参数时的区别。但是假设我们只对这种用法感兴趣。

问题:

  1. 对于做这种作业,为什么我不应该总是使用第一个?
  2. 比较最后两者,这两者的编译和/或运行时有什么不同吗?如果不使用,我为什么要使用 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/

相关文章:

ios - iOS 设备的 MDM OTA 注册

ios - 激活约束 : and deactivateConstraints: not persisting after rotation for constraints created in IB

ios - 如果应用程序被杀死,NSURLSessionTask 会发生什么

ios - 设置 UIView 的框架不起作用

ios - 导航栏中的背景图像转到屏幕顶部

ios - 使用 NSDictionary 元素缓慢创建 NSMutableArray

iphone - 使用导航栏和后退按钮创建模态视图

c++ - 在 Objective-C 中使用 fopen()

ios - 如何保护 iOS bundle 文件,如 plist、图像、sqlite、媒体文件

ios - 如何查询具有特定属性值的核心数据对象