gpt4 book ai didi

objective-c - NSString 让我大吃一惊

转载 作者:塔克拉玛干 更新时间:2023-11-02 09:33:46 24 4
gpt4 key购买 nike

我有三个 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com