2014-01-08 30 views
0

想象一下我定義一個變量,像這樣目標C:分配使得所有的指針變量獲得新值的值

NSString * a = @"Hello people"; 

現在我複製指向B,使用a和b點位置在那裏@「你好的人」被存儲在內存中(右?或者我誤解是如何工作的?)

NSString * b = a; 

現在我想b變更,使得也更新了新的價值。下面不起作用,因爲它會指向B到A 的NSString @「謝謝大家」

b = @"Thanks all!"; 
NSLog(@"%@", a); // still "Hello World" 

,但我要的是取代無論是在存儲位置@「你好的人」,所以所有指向它的指針都會更新。

b = ????; 
NSLog(@"%@", a); // Whoa, it still points to the same memory location as b! 

謝謝!

回答

1

在這種情況下,您希望使用NSMutableString而不是NSString

因爲NSString是不可變的,所以當你改變原來的時候,它指向一個全新的實例。但是如果使用可變版本,即使內容改變,指針也保持不變。

但是 - 雖然這可行,但這是一個壞主意。這種可變性是脆弱的。例如,如果您在此屬性上有任何KVO觀察員,如果字符串更改,則不會觸發KVO通知。

編輯

另一種方法是使用多個間接:

NSString **string; 
&string = @"some string"; 

現在你可以有:

NSString **string2 = string; 

和變化字符串將被傳播到字符串2,因爲儘管指針是相同的,它指向的對象將會改變。

Hovewever,你需要取消引用指針使用它,即

NSLog (@"String is: %@", *string); 

NSLog (@String2 is: %@, *string2); 

但你仍然有可變性問題。

+0

嗯好的。但是我通常應該可以用其他東西替換一個內存位置,對吧?或者能夠立即更新從位置X到位置Y的所有指針?有沒有像那樣的東西? –

+0

但是,爲了替換一塊內存,你不需要知道該位置的指向,對嗎?我想將NSDate更新爲當前時間。如果我做b = [NSDate new];這是行不通的。但我該怎麼做呢? :-) –

+0

@WillemMulder刪除了我的最後一條評論,並用另一個選項更新了我的答案。 – Abizern