NSString *myString = @"sample string";
NSString *newString = [myString copy];
如果我在這兩行後面設置斷點,則myString的指針與newString的指針相同。NSString複製不復制?
WTF?是不是NSString複製應該返回一個指向新對象的指針?或者我錯過了一些關於拷貝應該如何工作的基礎知識?
NSString *myString = @"sample string";
NSString *newString = [myString copy];
如果我在這兩行後面設置斷點,則myString的指針與newString的指針相同。NSString複製不復制?
WTF?是不是NSString複製應該返回一個指向新對象的指針?或者我錯過了一些關於拷貝應該如何工作的基礎知識?
由於NSString
是不可變它可能只是在內部增加ref count
並完成它。
當您release
其中一個NSStrings它可能只是遞減ref count
- 標準內存管理。
你看到有什麼問題嗎?
想一想:NSMutableString
是NSString
的子類。當你的財產被宣佈爲NSString
時,你不希望它改變。
考慮一下,如果你使用retain
和有人給你NSMutableString
然後後來改變它,你的班級將被打破。
但是,您可能認爲總是copy
ing是緩慢的。所以NSString
的copy
只需調用retain
。 NSMutableString
的copy
進行實際複製。
通常吐出一個NSString *
更好,因爲人們不必一直複製它。
複製方法返回的字符串值是一種更好的做法,因爲返回的值可能是可變的字符串對象,並且可以在該方法返回後在其他線程中修改此值。
您可以分配新的變量像樣品
NSString *anotherString = [[NSString alloc] initWithString:originalString];
我不知道答案,但如果你改變的myString則有兩種不同的地址......直到字符串的內容是相同的是在同一地址... – 2010-03-26 06:41:45
首先,你實際上沒有調用copy,你叫做stringWithString :.其次,由於字符串是不可變的,因此編譯器和運行時會進行優化。通常不可變對象將返回一個額外的引用計數,而不是創建一個實際的新對象。 – 2010-03-26 06:41:48
可可之美 - 不需要複製數據時的副本...... – stefanB 2010-03-26 06:45:27