Objective c initWithArray vs initWithArray copyItems

Objective c initWithArray vs initWithArray copyItems,objective-c,nsarray,Objective C,Nsarray,我有一个问题,这两种方法在初始化数组时有什么区别 我假设copyItems将提供深度副本 你什么时候会用一个来对比另一个 谢谢大家! 这些方法的第一个结果(对我来说)是通过谷歌搜索得到的 initWithArray: copyItems: 有以下文件: 使用数组作为数组的数据对象源初始化新分配的数组 参数 数组 包含用于初始化新数组的对象的数组 旗帜 如果是,数组中的每个对象都会收到一条copyWithZone:消息,以创建对象的副本对象必须符合NSCopying 协议在托管内存环境中,这不是

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

我假设copyItems将提供深度副本

你什么时候会用一个来对比另一个

谢谢大家!

这些方法的第一个结果(对我来说)是通过谷歌搜索得到的

initWithArray: copyItems:
有以下文件:

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

参数
数组
包含用于初始化新数组的对象的数组

旗帜
如果是,数组中的每个对象都会收到一条copyWithZone:消息,以创建对象的副本对象必须符合NSCopying 协议在托管内存环境中,这不是 保留对象将收到的消息。对象副本是 然后添加到返回的数组中。如果否,则在托管内存中 环境数组中的每个对象在 它被添加到返回的数组中

initWithArray:
有以下文档:

通过在新分配的数组中放置给定数组中包含的对象来初始化该数组

e、 g。 注意:由于NSArray是不可变的,因此我相应的实现不能直接使用

鉴于

 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: copyItems:
有以下文件:

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

参数
数组
包含用于初始化新数组的对象的数组

旗帜
如果是,数组中的每个对象都会收到一条copyWithZone:消息,以创建对象的副本对象必须符合NSCopying 协议在托管内存环境中,这不是 保留对象将收到的消息。对象副本是 然后添加到返回的数组中。如果否,则在托管内存中 环境数组中的每个对象在 它被添加到返回的数组中

initWithArray:
有以下文档:

通过在新分配的数组中放置给定数组中包含的对象来初始化该数组

e、 g。 注意:由于NSArray是不可变的,因此我相应的实现不能直接使用

鉴于

 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
。因此,如果在新数组中编辑对象,即使在给定数组中也会修改该对象。(见浅表副本)

另一方面,
initWithArray:copyItems:
,如果将
YES
作为第二个参数传递,则将提供深度副本

请注意,如果您需要深度复制整个嵌套数据结构,那么这种方法是不够的。(见苹果)

例如:

NSMutableString *s = [[NSMutableString alloc] initWithString:@"hello"];
NSArray *a = @[s];
NSArray *b = [[NSArray alloc] initWithArray:a];
[a[0] appendString:@" there"];
在这些行之后,数组
a
b
将包含可变字符串“hello here”


而在这些行之后,数组
c
将包含可变字符串“hello”,数组
a
将包含可变字符串“hello there”

initWithArray:
初始化一个新数组,并将给定数组中包含的所有对象放入其中。这意味着给定数组中的每个对象将接收一个
retain
。因此,如果在新数组中编辑对象,即使在给定数组中也会修改该对象。(见浅表副本)

另一方面,
initWithArray:copyItems:
,如果将
YES
作为第二个参数传递,则将提供深度副本

请注意,如果您需要深度复制整个嵌套数据结构,那么这种方法是不够的。(见苹果)

例如:

NSMutableString *s = [[NSMutableString alloc] initWithString:@"hello"];
NSArray *a = @[s];
NSArray *b = [[NSArray alloc] initWithArray:a];
[a[0] appendString:@" there"];
在这些行之后,数组
a
b
将包含可变字符串“hello here”


虽然在这些行之后,数组
c
将包含可变字符串“hello”,而数组
a
将包含可变字符串“hello there”

我确实读过,但我仍然不确定这是什么意思。你能给我举个例子,说明你什么时候会使用其中一种吗?关于array2=array1?这只会使指针array2指向与array1相同的内存。不是抄袭。我确实读过,但我还是不知道那是什么意思。你能给我举个例子,说明你什么时候会使用其中一种吗?关于array2=array1?这只会使指针array2指向与array1相同的内存。不复制。@特洛伊敌人谢谢你的链接。我刚刚读了它,似乎copyItems不能做深度复制。我很好奇什么时候该用其中一种。我一直只使用
initWithArray
@特洛伊木马,谢谢你的链接。我刚刚读了它,似乎copyItems不能做深度复制。我很好奇什么时候该用其中一种。我一直只使用
initWithArray
实际上在第二个示例中正好相反:“a”将包含“hello there”,而“c”将包含“hello”:)您确定正确阅读了示例吗?我只是运行了代码,它按预期工作。我只是按原样粘贴了第二个示例。”a'记录“你好”,c'记录“你好”,这是预期的结果c'保存一个副本,即一个全新的对象。附加仅影响“原始”。啊,是的,对不起,我没有读我的描述,我只是读了我的代码。是的,很明显我颠倒了它们,但这个例子正是我想展示的。现在我来修正答案,谢谢。实际上,在第二个示例中,答案正好相反:“a”将包含“hello there”,而“c”将包含“hello”:)您确定正确阅读了示例吗?我只是运行了代码,它按预期工作。我只是粘贴