當你進行第二次分配,以你的string2
變量,你沒有修改什麼樣的變量當前是指,在這種情況下,同樣的NSString
可變string1
指的是內容,而是你正在修改到什麼string2
指。
的圖象(代碼)是千言萬語:
每個對象和可變具有內部名稱,通常被稱爲它的地址。地址通常寫成十六進制數字,例如0xdeadbeef
,值的數字對你來說並不重要 - 它只是一個標籤。
當你寫:
NSString *string1 = @"Hello!";
右手邊問Objective-C的創造與價值@"Hello"
的NSString
,這樣做的結果是一個地址,說0xfeeddeaf
。 lhs-side:請求一個變量,該變量能夠容納其中的NSString *
- 對NSString
的引用;稱這個變量爲string1
;並將rhs的結果,0xfeeddeaf
存儲在其中。
當你寫信:
NSString *string2 = string1;
這導致可變string2
還含有0xfeeddeaf
。 string1
和string2
的內容之間沒有聯繫,賦值只是複製一個值(這是一個地址)。
最後,當你寫:
string2 = @"changed";
這與@"changed"
一個地址,說的0xbeedcafe
並存儲在string2
價值創造的NSString
。所以現在string1
包含0xfeeddeaf
這是@Hello
的地址,而string2
包含0xbeedcafe
這是@"changed
的地址。
當你寫,你我猜「嘗試使用修改一個指針的內容,另一個」你想要什麼是string1
和string2
來指代相同對象,其值可以修改。您無法修改NSString
的值,創建後它們是不可修改的(不可變的)。相反,您必須使用NSMutableString
和您需要使用方法來更改NSMutableString
對象的值 - 如上所述,如果使用分配,您更改引用哪個對象,而不是對象的內容。
假設你正在使用ARC [*]然後改變你的代碼:
NSMutableString *string1 = [NSMutableString stringWithString:@"Hello"];
NSMutableString *string2 = string1;
[string2 setString:@"changed"];
將完成什麼,我認爲你打算。前兩行執行與上面類似的操作,最後會顯示包含相同地址的string1
和string2
。第三行改變了他們都提到的地址 - 你有你想要的聯繫。
[*]如果要使用GC或retain
/release
變化的第一行的RHS到[[NSMutableString alloc] initWithString:"@Hello"]
來源
2012-02-06 08:36:21
CRD
方法'-setString:'不會在[文檔】(HTTPS存在://顯影劑。 apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSString_Class/Reference/NSString.html)。這是一個私人API嗎? – 2012-02-06 02:25:17
@ RichardJ.RossIII不,我只是一個白癡。它在'NSMutableString'中,你會看到我創建了一個'NSMutableString'實例。我只是繼續使用'NSString *'存儲類型,因爲複製了原來的答案。所以從技術上講,原文是完全有效和合法的,但會產生編譯器警告;一個快速指針類型的變化(我現在就會生效),你甚至不會得到警告。 – Tommy 2012-02-06 12:35:17
好吧,我明白,一直髮生在我身上。 – 2012-02-06 13:20:22