1
說我有兩個數組:賦值運算符是否創建NSArray的淺表副本?
NSArray *A = @[@"Red", @"Blue", @"Yellow"];
NSArray *B = A;
您是來自B技術上的淺表副本?如果我對A中包含的數據進行更改,則B會看到相同的更改,反之亦然。在Apple文檔中查看複製時,通過「=」運算符的簡單平等不會被視爲製作淺拷貝的有效方法。如果這不構成淺拷貝,那麼它是什麼?
說我有兩個數組:賦值運算符是否創建NSArray的淺表副本?
NSArray *A = @[@"Red", @"Blue", @"Yellow"];
NSArray *B = A;
您是來自B技術上的淺表副本?如果我對A中包含的數據進行更改,則B會看到相同的更改,反之亦然。在Apple文檔中查看複製時,通過「=」運算符的簡單平等不會被視爲製作淺拷貝的有效方法。如果這不構成淺拷貝,那麼它是什麼?
賦值(在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]和b [0]都變爲@「Green」,是不是因爲b是a的淺拷貝?你是通過使用賦值運算符來實現的,這是我在淺拷貝與賦值之間混淆的基礎。它們都將引用複製到內存中的對象。 –