我有一个问题,这两个方法在初始化数组时有什么区别?
我假设copyItems会提供深层拷贝吗?
你什么时候使用哪一个?
谢谢!
答案 0 :(得分:5)
这些方法的documentation是第一个(对我而言)谷歌搜索的结果。
initWithArray: copyItems:
有这个文件:
使用anArray初始化新分配的数组作为数组的数据对象的源。
<强>参数强>
阵列
包含用于初始化新数组的对象的数组。标志
如果是,则数组中的每个对象都接收一个copyWithZone:消息来创建对象的副本 - 对象必须符合NSCopying 协议。在托管内存环境中,这不是 保留对象否则将收到的消息。对象副本是 然后添加到返回的数组中。如果否,那么在托管内存中 环境中数组中的每个对象只是在收到保留消息时 它被添加到返回的数组中。
而initWithArray:
有此文档:
通过在其中放置给定数组中包含的对象来初始化新分配的数组。
e.g。 注意:由于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];
答案 1 :(得分:3)
initWithArray:
初始化一个新数组,并在其中放置给定数组中包含的所有对象。这意味着给定数组中的每个对象都将收到retain
。因此,如果编辑新数组中的对象,即使在给定的数组中也会修改该对象。 (见浅版)
另一方面,如果initWithArray:copyItems:
作为第二个参数传递,YES
将提供深层复制。
请注意,如果您需要深度复制整个嵌套数据结构,那么这种方法是不够的。 (参见Apple documentation)
示例:
NSMutableString *s = [[NSMutableString alloc] initWithString:@"hello"];
NSArray *a = @[s];
NSArray *b = [[NSArray alloc] initWithArray:a];
[a[0] appendString:@" there"];
在这些行之后,数组a
和b
将包含可变字符串“hello there”
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”