2012-02-06 52 views
0

我想修改一個指針的內容使用另一個。我希望string2指向string1指向的內容,以便在修改string2時修改string1。我怎樣才能做到這一點?簡單複製指針與目標C

NSString *[email protected]"hello"; 
NSString *string2=string1; 
[email protected]"changed"; 
NSLog(@"string1:%@, string2:%@", string1, string2); //"string1:hello, string2:changed" 

回答

2

當你進行第二次分配,以你的string2變量,你沒有修改什麼樣的變量當前是指,在這種情況下,同樣的NSString可變string1指的是內容,而是你正在修改到什麼string2指。

的圖象(代碼)是千言萬語:

每個對象和可變具有內部名稱,通常被稱爲它的地址。地址通常寫成十六進制數字,例如0xdeadbeef,的數字對你來說並不重要 - 它只是一個標籤。

當你寫:

NSString *string1 = @"Hello!"; 

右手邊問Objective-C的創造與價值@"Hello"NSString,這樣做的結果是一個地址,說0xfeeddeaf。 lhs-side:請求一個變量,該變量能夠容納其中的NSString * - 對NSString的引用;稱這個變量爲string1;並將rhs的結果,0xfeeddeaf存儲在其中。

當你寫信:

NSString *string2 = string1; 

這導致可變string2還含有0xfeeddeafstring1string2的內容之間沒有聯繫,賦值只是複製一個值(這是一個地址)。

最後,當你寫:

string2 = @"changed"; 

這與@"changed"一個地址,說的0xbeedcafe並存儲在string2價值創造的NSString。所以現在string1包含0xfeeddeaf這是@Hello的地址,而string2包含0xbeedcafe這是@"changed的地址。

當你寫,你我猜「嘗試使用修改一個指針的內容,另一個」你想要什麼是string1string2來指代相同對象,其值可以修改。您無法修改NSString的值,創建後它們是不可修改的(不可變的)。相反,您必須使用NSMutableString您需要使用方法來更改NSMutableString對象的值 - 如上所述,如果使用分配,您更改引用哪個對象,而不是對象的內容。

假設你正在使用ARC [*]然後改變你的代碼:

NSMutableString *string1 = [NSMutableString stringWithString:@"Hello"]; 
NSMutableString *string2 = string1; 
[string2 setString:@"changed"]; 

將完成什麼,我認爲你打算。前兩行執行與上面類似的操作,最後會顯示包含相同地址的string1string2。第三行改變了他們都提到的地址 - 你有你想要的聯繫。

[*]如果要使用GC或retain/release變化的第一行的RHS到[[NSMutableString alloc] initWithString:"@Hello"]

4

您需要一個指向NSString的實例的指針。 例子:

NSString *string1 = @"Hello!"; 
NSString **string2 = &string1; // get the address of string1 
*string2 = @"changed"; // set what string2 points to be 'changed' 

NSLog(@"string1:%@, string2:%@", string1, *string2); // should print "string1: changed, string2: changed" 
0

作爲替代理查德·羅斯三世的答案,因爲他們已經指針 - 你買了一個間接層 - 只要確保你改變在他們指向的地址是什麼同時把它留在那個地址。所以,例如

NSMutableString *string1 = [[NSMutableString alloc] initWithString:@"hello"]; 
NSMutableString *string2 = string1; 

[string2 setString:@"changed"]; 

NSLog(@"string1: %@, string2: %@"); // "string1: changed, string2: changed" 

,因爲它去太多反對的正常可可實踐的流動,但瞭解這是怎麼回事指針和如何通信的對象是值得它不是一個真正的可行的通用解決方案。

+0

方法'-setString:'不會在[文檔】(HTTPS存在://顯影劑。 apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSString_Class/Reference/NSString.html)。這是一個私人API嗎? – 2012-02-06 02:25:17

+0

@ RichardJ.RossIII不,我只是一個白癡。它在'NSMutableString'中,你會看到我創建了一個'NSMutableString'實例。我只是繼續使用'NSString *'存儲類型,因爲複製了原來的答案。所以從技術上講,原文是完全有效和合法的,但會產生編譯器警告;一個快速指針類型的變化(我現在就會生效),你甚至不會得到警告。 – Tommy 2012-02-06 12:35:17

+0

好吧,我明白,一直髮生在我身上。 – 2012-02-06 13:20:22