2012-11-14 131 views
1

考慮:創建一個NSString指針

NSString*test2=[[NSString alloc]init]; 

[email protected]"yo"; 
NSString *test= test2; 
NSLog(@"test: %@ test2: %@",test, test2); 
[email protected]"what the?"; 
NSLog(@"test: %@ test2: %@",test, test2); 

輸出:

2012-11-14 09:50:26.720 testt[693:c07] test: yo test2: yo 
2012-11-14 09:50:26.721 testt[693:c07] test: yo test2: what the? 

要怎樣才能test一個真正的指針,這樣當test2的變化,因此不test

+1

您需要使用指針指針,因爲'test'已經是一個指針。 –

回答

4

NSString *test2已經是一個指針。你會想使test指針一個指針(雙重*),並使用&前綴將test2的地址分配給它,然後使用*前綴訪問該值。我吮吸解釋這個,所以這裏是代碼:

[email protected]"yo"; 
NSString **test= &test2; 
NSLog(@"test: %@ test2: %@", *test, test2); 
[email protected]"what the?"; 
NSLog(@"test: %@ test2: %@", *test, test2); 
+0

作品很好,是一個很好的考試,謝謝 – johnbakers

0

我會嘗試像下面這樣:

NSString *test = &test2; 
+0

請參閱上面的@ FilipRadelic答案 - 它需要兩顆星,而不是一顆。 – johnbakers

2

創造了一個「真正的指針」,問題是,聲明:

test2 = @"What the?"; 

是創建一個新的字符串對象並將指向新字符串的指針分配給變量test2,test仍包含舊指針。

你可以創建一個指針來解決這個問題。或者,您可以使用NSMutableString,然後僅使用NSMutableString方法更改(變更)該字符串,而不是將新值重新分配給testtest2變量。

以下將是NSMutableString版本的例子:

NSString *test2 = [[NSMutableString alloc] initWithString:@"yo"];  
NSString *test = test2; 

NSLog(@"test: %@ test2: %@", test, test2); 

[test2 setString:@"what the?"]; 

NSLog(@"test: %@ test2: %@", test, test2); 

它產生的輸出:

2012-11-14 10:06:27.231 Untitled 2[592:707] test: yo test2: yo 
2012-11-14 10:06:27.232 Untitled 2[592:707] test: what the? test2: what the? 

NSString■找在Objective-C,使一些額外的語法糖以下兩者具有相同的效果(儘管在後臺發生的情況可能完全不同或相同)。

NSString *test = [NSString alloc] initWithString:@"Hello World"]; 
NSString *test = @"Hello World"; 

這兩個語句都會創建一個新的不可變(不可更改)字符串。使用語句[NSString alloc] init]創建NSString會創建一個空字符串,這通常不是您想要執行的操作。


這意味着,在您的示例,其中前兩行是:

NSString*test2=[[NSString alloc]init]; 
[email protected]"yo"; 

第一行是不必要的,因爲要創建一個字符串對象,並把該指針在test2,然後立即重寫該指針帶有指向由@"yo"創建的字符串的指針。如果您不使用ARC,則會導致內存泄漏,因爲由[[NSString alloc] init]創建的字符串尚未發佈。然而,NSString並沒有真正的工作同其他對象,因此而不是內存泄漏,它可能會更正確的說你是在浪費內存」

+0

NSMutableString可能是一個更好的解決方案,是的。我想知道OP在努力實現什麼。 –

+0

我只是試圖瞭解Objective C中的字符串和指針是如何工作的。這是一個比任何事情都重要的練習。 – johnbakers

+0

關於你有關「額外語法糖」的觀點 - 在第一個中顯式調用'init'現在創建所有權,而第二個,'= @「喲」'不是,因此內存泄漏對於第二種方法,而第一種方法如果在非Arc環境中沒有釋放,就會冒風險,對嗎? – johnbakers