initWithArray与initWithArray copyItems

时间:2013-11-20 14:29:06

标签: objective-c nsarray

我有一个问题,这两个方法在初始化数组时有什么区别?

我假设copyItems会提供深层拷贝吗?

你什么时候使用哪一个?

谢谢!

2 个答案:

答案 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"];

在这些行之后,数组ab将包含可变字符串“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”