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