2015-12-05 82 views
0

比方說,我有NSString類型string1string2,string2被分配爲string2 = string1。如果string1更新爲其他值,則相應地更新string2 WAS NOT爲什麼NSString和NSMutableArray的改變行爲是不同的?

NSString *string1 = @"hello world"; 
NSString *string2 = string1; 
NSLog(@"string 1: %@", string1); 
NSLog(@"string 2: %@", string2); 
NSLog(@"==================="); 
string1 = @"hello world(changed)"; 
NSLog(@"string 1: %@", string1); 
NSLog(@"string 2: %@", string2); 

但是,如果我有NSMutableArray的類型ARRAY1數組2,數組2被分配了作爲 數組2 = ARRAY1。如果array1更新爲其他值,則相應地更新array2 WAS

NSMutableArray *array1 = [NSMutableArray new]; 
NSMutableArray *array2 = [NSMutableArray new]; 
[array1 addObject:@"hello"]; 
array2 = array1; 
NSLog(@"array 1: %@", array1); 
NSLog(@"array 2: %@", array2); 
NSLog(@"==================="); 
[array2 addObject:@"world"]; 
NSLog(@"array 1: %@", array1); 
NSLog(@"array 2: %@", array2); 

我知道,NSString的情況下,如果我想使字符串1和字符串都是一樣的,我可以做字符串2的指針指向字符串1,NSString __strong **string2= &string1;和NSMutableArray的情況下,我可以使用array2 = [array1 copy]如果我不想array2始終與array1相同。

但我的問題是,在我看來他們都是對象類型和NSObject的子類。這種不同的行爲的原因是什麼?一個不更新,另一個更新時會相應更新?

+0

你的例子完全不同。在你改變'array1'之後,你將數組'array1'分配給'array2'。但是在改變'string1'之前,你將字符串'string1'分配給'string2'。 – rmaddy

+0

不要:'NSString __strong ** string2 =&string1;',它只會導致混淆和顛覆Objective-C對象。 – zaph

回答

3

在您的字符串示例中,兩個變量都指向相同的內存位置。但是當你做

string1 = @"hello world(changed)"; 

你沒有對string1執行任何操作。相反,你的string1指針現在指向一個新創建的對象。

而在您的數組示例中,您對數組對象執行了一個操作,該操作仍然由兩個指針指向。

在你的第二個例子,如果你這樣做

array2 = @[@"new array"]; 

兩個指針現在將指向2個不同的對象。

+1

是的,你的解釋解決了我的難題,謝謝。 –

1

使用%p登錄string1像:

NSLog(@"string 1: %p", string1); 

你會看到string1內存地址之前和之後發生變化。 也可以在array上嘗試。

相關問題