NSString的性质

时间:2013-04-13 13:29:19

标签: objective-c cocoa nsstring

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

NSString *str = @"Hello";

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

我应该何时使用每一个?

2 个答案:

答案 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

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

修改

另见What's the difference between NSString *s = @"string" and NSString *s = [[NSString alloc] initWithString:@"string"]?