我有三个 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];
有趣的是,在将它们初始化为不同的对象后,它们是同一个对象!
这是某种编译器优化吗?
谢谢
最佳答案
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/