2016-01-29 57 views
0

我有這個代碼行:newArray = array和newArray = [數組副本]有什麼區別?

- (void)redrawGraphWithArray:(NSArray *)array { 
    _graphView.graphPoints = [array copy]; 
    [_graphView setNeedsDisplay]; 
} 

graphPoints是NSArray的了。

如果我使用

_graphView.graphPoints = array; 

圖看起來相同,沒有任何問題。

我想知道這是

_graphView.graphPoints = [array copy]

_graphView.graphPoints = array;

感謝之間的差異。

回答

0

[array copy]將創建數組的新實例(具有相同的內容)並將其分配給圖點。就像你只是分配數組一樣,圖形點將具有與對象數組相同的引用。也就是說,兩者都會指向同一個對象。因此,如果您更改數組對象,那麼它也會更改圖點。但是,如果您使用複製,情況就不會如此。

0

這是一個不成熟的優化。

主要區別:第一種方法會導致您不擁有且不必釋放的自動釋放「複製」,而您擁有在第二行創建的對象。順便說一句,這兩個數組都是不可變的。

1

_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協議(如果你只是使用像NSDictionaryFoundation類,NSArrayNSNumberNSString也全部包含的對象的複製,你不」不必擔心,因爲這已經爲您完成了)並在NSArray上使用- initWithArray:copyItems:初始值設定項。但是,即使這樣也會創建包含對象的淺表副本,但是如果需要這樣做,還有大量關於如何實現完整「深層」副本的信息。

相關問題