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
會處理它。
在回答你的第二個問題時,我傾向於第二個版本,理由是它更短,因此更清楚地表明你打算做什麼。後者有一些理論上的性能好處 - 特別是如果你在多個地方使用相同的文字 - 但它們如此令人難以置信的微不足道,因爲現在不值得考慮。