这样一个基本的问题,但我不知道答案。究竟有什么区别:
NSString *str = @"Hello";
和
NSString *str = [[NSString alloc] initWithString:@"Hello"];
我应该什么时候使用每一个?
这样一个基本的问题,但我不知道答案。究竟有什么区别:
NSString *str = @"Hello";
和
NSString *str = [[NSString alloc] initWithString:@"Hello"];
我应该什么时候使用每一个?
表达式在@""
编译时1被替换为的实例,该实例是具有固定内存布局2NSConstantString
的专用子类。这也解释了为什么是唯一可以在编译时初始化的对象3。NSString
NSString
A[[NSString alloc]initWithString:@""]
产生一个 NSString 实例,用文字表达式初始化该实例,然后释放该实例。因此,对象分配是多余的,立即丢弃。这就是为什么在创建不可变字符串时应该始终只使用文字的原因。
1重写表达式的 LLVM 代码RewriteModernObjC::RewriteObjCStringLiteral
位于RewriteModernObjC.cpp中。
2要查看NSConstantString
定义,请在 Xcode 中 cmd+单击它。
3为其他类创建编译时常量很容易,但需要编译器使用专门的子类。这会破坏与旧 Objective-C 版本的兼容性。
我应该什么时候使用每一个?
NSString *str = [[NSString alloc] initWithString:@"Hello"]; //1st one
以上是多余的,与
NSString *str = @"Hello"; //2nd one
所以总是使用较短的。即我的例子中的第二个。
编辑:
另请参阅此NSString *s = @"string" 和 NSString *s = [[NSString alloc] initWithString:@"string"] 有什么区别?