1.Assignment誰能告訴我NSArray的賦值和拷貝之間的區別?
NSArray* a = xxxxxx;
NSArray* b;
b = a;
2.複印
NSArray* a = xxxxxx;
NSArray* b;
b = [a copy];
我知道副本是 「輕副本」,可變副本是 「深層複製」。
拷貝是拷貝內存地址,而可變拷貝是拷貝內存對象。
但我不知道任務和副本的不同。
這是一樣的嗎?
1.Assignment誰能告訴我NSArray的賦值和拷貝之間的區別?
NSArray* a = xxxxxx;
NSArray* b;
b = a;
2.複印
NSArray* a = xxxxxx;
NSArray* b;
b = [a copy];
我知道副本是 「輕副本」,可變副本是 「深層複製」。
拷貝是拷貝內存地址,而可變拷貝是拷貝內存對象。
但我不知道任務和副本的不同。
這是一樣的嗎?
This蘋果文檔是有幫助的:
正常的拷貝是淺拷貝,產生一個新的集合與原對象的 股份所有權。深度複製從原始創建新對象並將其添加到新集合中。
因此,在你的第一個例子,b
指向相同的NSArray實例作爲a
。在第二個示例中,b
指向一個新的NSArray實例,該實例包含對a
指向的數組中包含的相同對象的引用。
b = a;
b
指向的地址與a
指向的地址相同。所以改變任何一個都是一樣的。這被稱爲call by reference
。
b = [a copy];
正在創建a
的另一個對象,並指向b
。這裏形成了兩組不同的物體,所以改變任何一個物體都將是相互獨立的。這就像call by value
。並且這裏b
將保存a
的不可變拷貝,即使a
是可變的。
這實際上是不正確的 - 第一個不是淺拷貝,只是將'b'指向與a'相同的對象;第二個是淺的複製 – Alex
@Alexander:謝謝...編輯:) –
恩......我明白了,我認爲你是對的,非常感謝你。 – H3c
我還有一個問題。如果我使用副本,我更改b的數據,那麼a的數據也會改變? – H3c
這取決於你所說的'改變b的數據'。如果你從一個對象中刪除對象(你需要使用NSMutableArray來完成這個任務,那麼不需要改變b(因爲b保留了對象)如果你改變了一個對象的屬性,那麼你會看到同樣的對象在b。 – Alex