Objective c initWithArray vs initWithArray copyItems
我有一个问题,这两种方法在初始化数组时有什么区别 我假设copyItems将提供深度副本 你什么时候会用一个来对比另一个 谢谢大家! 这些方法的第一个结果(对我来说)是通过谷歌搜索得到的Objective c initWithArray vs initWithArray copyItems,objective-c,nsarray,Objective C,Nsarray,我有一个问题,这两种方法在初始化数组时有什么区别 我假设copyItems将提供深度副本 你什么时候会用一个来对比另一个 谢谢大家! 这些方法的第一个结果(对我来说)是通过谷歌搜索得到的 initWithArray: copyItems: 有以下文件: 使用数组作为数组的数据对象源初始化新分配的数组 参数 数组 包含用于初始化新数组的对象的数组 旗帜 如果是,数组中的每个对象都会收到一条copyWithZone:消息,以创建对象的副本对象必须符合NSCopying 协议在托管内存环境中,这不是
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”:)您确定正确阅读了示例吗?我只是运行了代码,它按预期工作。我只是粘贴