2010-03-26 55 views
6
NSString *myString = @"sample string"; 
    NSString *newString = [myString copy]; 

如果我在這兩行後面設置斷點,則myString的指針與newString的指針相同。NSString複製不復制?

WTF?是不是NSString複製應該返回一個指向新對象的指針?或者我錯過了一些關於拷貝應該如何工作的基礎知識?

+0

我不知道答案,但如果你改變的myString則有兩種不同的地址......直到字符串的內容是相同的是在同一地址... – 2010-03-26 06:41:45

+2

首先,你實際上沒有調用copy,你叫做stringWithString :.其次,由於字符串是不可變的,因此編譯器和運行時會進行優化。通常不可變對象將返回一個額外的引用計數,而不是創建一個實際的新對象。 – 2010-03-26 06:41:48

+0

可可之美 - 不需要複製數據時的副本...... – stefanB 2010-03-26 06:45:27

回答

9

由於NSString不可變它可能只是在內部增加ref count並完成它。

當您release其中一個NSStrings它可能只是遞減ref count - 標準內存管理。

你看到有什麼問題嗎?

6

想一想:NSMutableStringNSString的子類。當你的財產被宣佈爲NSString時,你不希望它改變。

考慮一下,如果你使用retain和有人給你NSMutableString然後後來改變它,你的班級將被打破。

但是,您可能認爲總是copy ing是緩慢的。所以NSStringcopy只需調用retainNSMutableStringcopy進行實際複製。

通常吐出一個NSString *更好,因爲人們不必一直複製它。

1

複製方法返回的字符串值是一種更好的做法,因爲返回的值可能是可變的字符串對象,並且可以在該方法返回後在其他線程中修改此值。

1

您可以分配新的變量像樣品

NSString *anotherString = [[NSString alloc] initWithString:originalString];