- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我有三个 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/
我正在研究有关Node.js的教程,网址为:http://www.johnpapa.net/get-up-and-running-with-node-and-visual-studio/ 我可以让该应
我是一名优秀的程序员,十分优秀!