-1

这样一个基本的问题,但我不知道答案。究竟有什么区别:

NSString *str = @"Hello";

NSString *str = [[NSString alloc] initWithString:@"Hello"];

我应该什么时候使用每一个?

4

2 回答 2

4

表达式在@""编译时1被替换为的实例,该实例是具有固定内存布局2NSConstantString的专用子类。这也解释了为什么是唯一可以在编译时初始化的对象3NSStringNSString

A[[NSString alloc]initWithString:@""]产生一个 NSString 实例,用文字表达式初始化该实例,然后释放该实例。因此,对象分配是多余的,立即丢弃。这就是为什么在创建不可变字符串时应该始终只使用文字的原因。

1重写表达式的 LLVM 代码RewriteModernObjC::RewriteObjCStringLiteral位于RewriteModernObjC.cpp中。
2要查看NSConstantString定义,请在 Xcode 中 cmd+单击它。
3为其他类创建编译时常量很容易,但需要编译器使用专门的子类。这会破坏与旧 Objective-C 版本的兼容性。

于 2013-04-13T14:14:30.140 回答
2

我应该什么时候使用每一个?

NSString *str = [[NSString alloc] initWithString:@"Hello"]; //1st one

以上是多余的,与

NSString *str = @"Hello"; //2nd one

所以总是使用较短的。即我的例子中的第二个。

编辑:

另请参阅此NSString *s = @"string" 和 NSString *s = [[NSString alloc] initWithString:@"string"] 有什么区别?

于 2013-04-13T13:31:17.437 回答