我有一個問題這兩個方法初始化數組之間有什麼區別?initWithArray vs initWithArray copyItems
我假設copyItems將提供深層複製?
什麼時候你會使用一個與另一個?
謝謝!
我有一個問題這兩個方法初始化數組之間有什麼區別?initWithArray vs initWithArray copyItems
我假設copyItems將提供深層複製?
什麼時候你會使用一個與另一個?
謝謝!
這些方法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];
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"];
這些行之後的陣列a
和b
將包含可變的字符串 「你好」
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」
@trojanfoe謝謝你的鏈接。我剛剛閱讀它,它似乎像copyItems不做深層複製。我很好奇何時使用其中一種。我一直只使用'initWithArray' – Alan