initWithArray与initWithArray copyItems

Ala*_*lan 1 objective-c nsarray

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

我假设copyItems将提供深层副本?

您何时会使用一个与另一个?

谢谢!

Jam*_*ter 5

这些方法的文档是对Google进行少量搜索的第一个结果(对我而言)。

initWithArray: copyItems:
Run Code Online (Sandbox Code Playgroud)

有此文档:

使用anArray初始化新分配的数组作为该数组的数据对象的源。

参数
array
一个包含用于初始化新数组的对象的数组。

标志
如果为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],
]
Run Code Online (Sandbox Code Playgroud)

 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];
Run Code Online (Sandbox Code Playgroud)