_graphView.graphPoints = array;
將graphPoints分配爲與原始對象相同的數組。你只是創建另一個指向完全相同內存的指針。因此,舉例來說,會出現這種情況:
NSMutableArray *array = [[NSMutableArray alloc] init];
array[0] = @{@"x": @1, @"y": @2};
array[1] = @{@"x": @1, @"y": @3};
_graphView.graphPoints = array;
// Now let's make some changes to the original array
// Note that I used an NSMutableArray to explain fully the differences between
// the two assignment types.
array[0] = @{@"x": @1, @"y": @1}; // With an NSArray you wouldn't be able to do this
array[1][@"y"] = @5; // But this can still happen
// What happens to graphPoints?
_graphView.graphPoints[0]; // <== {x: 1, y: 1}
_graphView.graphPoints[1]; // <== {x: 1, y: 5}
在這種情況下,graphPoints
點完全相同的對象array
使二者保持完全一致。代碼示例中沒有舉例說明,但要記住這個「相同性」指向兩個方向非常重要,因此對graphPoints
進行更改也將更改爲array
。
在另一方面,[array copy]
創建新的數組對象,它是原始的拷貝,因此上述碼將有不同的結果:
NSMutableArray *array = [[NSMutableArray alloc] init];
array[0] = @{@"x": @1, @"y": @2};
array[1] = @{@"x": @1, @"y": @3};
_graphView.graphPoints = [array copy];
// Now let's make the same changes to the original array
array[0] = @{@"x": @1, @"y": @1};
array[1][@"y"] = @5;
// What happens to graphPoints?
_graphView.graphPoints[0]; // <== {x: 1, y: 2}
_graphView.graphPoints[1]; // <== {x: 1, y: 5}
第一個目的沒有在graphPoints
改變,因爲我們寫了一個全新的對象到array
。由於graphPoints
現在是副本,所以不會受到影響。
然而,第二個目的做變化,因爲我們沒有寫一個新的對象爲array
,而是修改現有的對象,這是由都陣列包含。這說明了對象複製的一個重要細節。這就是所謂的「淺」副本,這意味着容器被複制,但其內容不會。你最終得到兩個數組,但只有一組包含的對象。
有相對簡單的方式通過確保包含的對象都實現了NSCopying
協議(如果你只是使用像NSDictionary
Foundation
類,NSArray
,NSNumber
,NSString
也全部包含的對象的複製,你不」不必擔心,因爲這已經爲您完成了)並在NSArray
上使用- initWithArray:copyItems:
初始值設定項。但是,即使這樣也會創建包含對象的淺表副本,但是如果需要這樣做,還有大量關於如何實現完整「深層」副本的信息。