objective-c - NSString 让我大吃一惊

标签 objective-c ios nsstring

我有三个 NSString 属性声明如下:

@property(nonatomic,retain) NSString *currentPassword;
@property(nonatomic,retain) NSString *newPassword;
@property(nonatomic,retain) NSString *confirmPassword;

我在 viewDidLoad 方法中初始化它们:

currentPassword = [[NSString alloc]init];
newPassword = [[NSString alloc]init];
confirmPassword = [[NSString alloc]init];

有趣的是,在将它们初始化为不同的对象后,它们是同一个对象!

enter image description here

这是某种编译器优化吗?

谢谢

最佳答案

Is this some kind of compiler optimization?

不完全是。它是常量的特殊情况值,并且是对已由 NSString 类实现的常见具体不可变类型/值的优化。

NSString 是不可变的。没有理由需要同一空字符串的多个实例。在这种简单的情况下,-[NSString init] 可以采用以下形式:

static NSString* const EmptyNSString = @"";

- (id)init
{
  self = [super init];
  [self release];
  return EmptyNSString;
}

类似地,+ [NSString string]:

+ (id)string
{
  return EmptyNSString;
}

因此,有一些静态不可变对象(immutable对象)可以在有意义的情况下以这种方式使用。其他明显的示例包括 + [NSArray array]+ [NSNumber numberWithBool:]

这些常量中的每一个都可以代表程序执行期间产生的数千个唯一分配。

这之所以有效,是因为 NSString 作为类簇:您将返回一个实现 NSString 声明的接口(interface)的许多不透明类型之一的对象。因此,NSMutableString 类型可以适本地实现 init:

- (id)init
{
  self = [super init];
  if (nil != self) { ... }
  return self;
}

最后,在几乎所有情况下,您都应该将 NSString 属性声明为 copy

关于objective-c - NSString 让我大吃一惊,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7803323/

相关文章:

iOS 应用更新通知

iphone - 验证 NSString 中是否存在单词

ios - Watchkit OS 2,WCSession 在后台运行

iphone - 在 iPhone 上采用 RGB 颜色并使用 UIColor 对其进行标准化

ios - 如何根据在前一个 Controller 中点击的单元格在 View Controller 上呈现数据

ios - 具有属性的 NSMutableArray

iphone - 是否可以在 nsstring 中包含引号?

ios - 如何制作像 Instagram 一样的导航栏

ios - 在不打开默认邮件应用程序的情况下发送电子邮件

ios - UITableView - 让图像跨越多个 UITableViewCells 并滚动