2015-11-03 50 views
1

說我有兩個數組:賦值運算符是否創建NSArray的淺表副本?

NSArray *A = @[@"Red", @"Blue", @"Yellow"]; 
NSArray *B = A; 

您是來自B技術上的淺表副本?如果我對A中包含的數據進行更改,則B會看到相同的更改,反之亦然。在Apple文檔中查看複製時,通過「=」運算符的簡單平等不會被視爲製作淺拷貝的有效方法。如果這不構成淺拷貝,那麼它是什麼?

回答

2

賦值(在Objective-C中)根本不是拷貝。也就是說,它不是對象的副本,它只是對象引用的副本。每個對象(引用)必須聲明爲一個指針是有原因的。 (塊是一個特例。)

淺表副本通過複製方法進行,如:NSArray *B = [A copy];

碰巧你不能修改NSArrays,但NSMutableArrays原則也同樣適用。

NSMutableArray *a = [@[@"Red", @"Blue", @"Yellow"] mutableCopy]; 
NSMutableArray *b = a; 
NSMutableArray *c = [a mutableCopy]; 

NSLog(@"%@, %@, %@", a[0], b[0], c[0]); // Prints: Red, Red, Red 

b[0] = @"Green"; 

NSLog(@"%@, %@, %@", a[0], b[0], c[0]); // Prints: Green, Green, Red 

c[0] = @"Purple"; 

NSLog(@"%@, %@, %@", a[0], b[0], c[0]); // Prints: Green, Green, Purple 
+0

很好的解釋,謝謝了。 –

+0

快速的問題,如果賦值是一個引用的副本,正如你所說,與淺拷貝不是一回事嗎? –

+0

在第二種情況下,[0]和b [0]都變爲@「Green」,是不是因爲b是a的淺拷貝?你是通過使用賦值運算符來實現的,這是我在淺拷貝與賦值之間混淆的基礎。它們都將引用複製到內存中的對象。 –