NSString
s很有趣,因为它们直到最近才是唯一可以作为文字提供的Objective-C对象。在iOS 4和OS X 10.6中添加的块对象是我所知道的另一个最近添加的内容,但它们有其自己的特定规则,所以我只是为了完整而提及。
C原语可以存储在堆或栈上。例如:
- (void)someMethod
{
int i = 3; // i is on the stack
}
- (void)someOtherMethod
{
int *i = (int *)malloc(sizeof(int)); // i now points to an 'int' on the heap
}
大多数Objective-C对象只能存储在堆上。您完全可以说alloc
在堆上提供了一个新对象,并且您的myString
调用的结果将是一个指向堆中NSString的指针。
但是,@""
语法是创建对象的简写。 @"Value"
实际上创建了一个对象文字。所以,举例来说,你可以这样做:
NSLog(@"%@", [@"Value" substringFromIndex:1]);
并且输出将是'alue'。您可以将substringFromIndex:
消息发送到@"Value"
,因为它是一个文字对象。
NSString
与initWithString:
的具体做法是具体实现,但是您可以确定,如果需要,它会将指向的内容复制一份。否则,你会看到奇怪的行为,如果你做了这样的事情:
NSMutableString *mutableString = [NSMutableString stringWithString:@"String"];
NSString *immutableString = [NSString stringWithString:mutableString];
[mutableString appendString:@" + hat"];
// immutableString would now have mutated if it was simply
// keeping a reference to the string passed in
因此您不必担心什么,你传递给它的寿命。这是NSString
的工作来解决这个问题。
在实践中,NSString
对象文字永远不会实际到期,所以这个问题有点没有实际意义。但是,如果您使用initWithUTF8String:
或其他需要C文字的内容,并且C文字在堆栈中,您仍然没有什么可担心的,因为NSString
会处理它。
在回答你的第二个问题时,我倾向于第二个版本,理由是它更短,因此更清楚地表明你打算做什么。后者有一些理论上的性能好处 - 特别是如果你在多个地方使用相同的文字 - 但它们如此令人难以置信的微不足道,因为现在不值得考虑。