2013-11-20 51 views
0

我有一個問題這兩個方法初始化數組之間有什麼區別?initWithArray vs initWithArray copyItems

我假設copyItems將提供深層複製?

什麼時候你會使用一個與另一個?

謝謝!

+0

@trojanfoe謝謝你的鏈接。我剛剛閱讀它,它似乎像copyItems不做深層複製。我很好奇何時使用其中一種。我一直只使用'initWithArray' – Alan

回答

4

這些方法documentation是第一個結果(對我來說)用一點谷歌搜索。

initWithArray: copyItems: 

具有本文檔:

初始化使用anArray作爲數據對象的陣列的源極的新分配的數組。

參數
陣列
含有用來初始化新陣列的對象的數組。

標誌
如果是YES,在陣列中的每個對象接收copyWithZone:消息創建對象對象的副本必須符合NSCopying 協議。在託管內存環境中,這不是該對象另外會收到的保留消息。對象副本是 然後添加到返回的數組。如果不是,那麼在託管內存 環境中,陣列中的每個對象只是在將 添加到返回的數組中時收到保留消息。

initWithArray:具有本文檔:

通過在它放置包含在給定陣列中的對象初始化一個新分配的陣列。

例如, 注:由於NSArray中是不可變的,我相應的實現是不能直接用於

`array2 = [[NSArray alloc] initWithArray:array1 copyItems:YES]` 
//would correspond to: 
array2 = @[ 
    [array1[0] copy], 
    [array1[1] copy], 
    [array1[2] copy], 
    ... 
    [array1[n] copy], 
] 

array2 = [[NSArray alloc] initWithArray:array1] 
//would correspond to: 
array2 = @[ 
    array1[0], 
    array1[1], 
    array1[2], 
    ... 
    array1[n], 
] 

//or 
array2[0] = array1[0]; 
array2[1] = array1[1]; 
array2[2] = array1[2]; 
... 
array2[n] = array1[n]; 
+0

我讀過這個,但我仍然不確定這意味着什麼。你能舉個例子說明你什麼時候可以使用其中一種嗎? – Alan

+0

請參閱編輯... –

+0

array2 = array1; ? –

2

initWithArray:初始化一個新的陣列和地方在它包含的所有對象給定數組。這意味着給定數組中的每個對象都將收到一個retain。因此,如果編輯新數組中的對象,則即使在給定數組中也會修改該對象。 (請參閱淺拷貝)

另一方面,如果YES作爲第二個參數傳遞,則initWithArray:copyItems:將提供深層副本。

請注意,如果您需要深度複製整個嵌套數據結構,那麼這種方法是不夠的。(見蘋果documentation

實施例:

NSMutableString *s = [[NSMutableString alloc] initWithString:@"hello"]; 
NSArray *a = @[s]; 
NSArray *b = [[NSArray alloc] initWithArray:a]; 
[a[0] appendString:@" there"]; 

這些行之後的陣列ab將包含可變的字符串 「你好」

NSMutableString *s = [[NSMutableString alloc] initWithString:@"hello"]; 
NSArray *a = @[s]; 
NSArray *c = [[NSArray alloc] initWithArray:a copyItems:YES]; 
[a[0] appendString:@" there"]; 

而這些線陣列c後將包含可變字符串「hello」,數組a將包含可變字符串「hello there」

+0

實際上在第二個例子中,情況恰恰相反:'a'將包含「hello there」,'c'將包含「hello」:) – joakim

+0

您確定您正確地閱讀了示例嗎?我只是運行代碼,它按預期工作。 –

+1

我剛貼上第二個例子。 'a'記錄「你好」和「c」記錄「你好」,這就是預期的結果。 'c'完整地保存副本,即新對象。追加隻影響'原始'。 https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/Collections/Articles/Copying.html – joakim

相關問題