2013-01-18 44 views
3

1.Assignment誰能告訴我NSArray的賦值和拷貝之間的區別?

NSArray* a = xxxxxx; 

NSArray* b; 

b = a; 

2.複印

NSArray* a = xxxxxx; 

NSArray* b; 

b = [a copy]; 

我知道副本是 「輕副本」,可變副本是 「深層複製」。

拷貝是拷貝內存地址,而可變拷貝是拷貝內存對象。

但我不知道任務和副本的不同。

這是一樣的嗎?

回答

2

This蘋果文檔是有幫助的:

正常的拷貝是淺拷貝,產生一個新的集合與原對象的 股份所有權。深度複製從原始創建新對象並將其添加到新集合中。

因此,在你的第一個例子,b指向相同的NSArray實例作爲a。在第二個示例中,b指向一個新的NSArray實例,該實例包含對a指向的數組中包含的相同對象的引用。

+0

恩......我明白了,我認爲你是對的,非常感謝你。 – H3c

+0

我還有一個問題。如果我使用副本,我更改b的數據,那麼a的數據也會改變? – H3c

+1

這取決於你所說的'改變b的數據'。如果你從一個對象中刪除對象(你需要使用NSMutableArray來完成這個任務,那麼不需要改變b(因爲b保留了對象)如果你改變了一個對象的屬性,那麼你會看到同樣的對象在b。 – Alex

0

b = a;b指向的地址與a指向的地址相同。所以改變任何一個都是一樣的。這被稱爲call by reference

b = [a copy];正在創建a的另一個對象,並指向b。這裏形成了兩組不同的物體,所以改變任何一個物體都將是相互獨立的。這就像call by value。並且這裏b將保存a的不可變拷貝,即使a是可變的。

+0

這實際上是不正確的 - 第一個不是淺拷貝,只是將'b'指向與a'相同的對象;第二個是淺的複製 – Alex

+0

@Alexander:謝謝...編輯:) –

相關問題