如果您有NSArray并且想要评估和更改元素,则无法从循环内部更改数组。因此,您创建了一个可以可以更改的可变副本。
代码示例:
NSMutableArray *bin = [NSMutableArray arrayWithObjects:@"0", @"1", @"2", @"3", @"4", @"5", @"6", @"7", nil];
NSMutableArray *list = [NSMutableArray arrayWithObjects:@"a1", @"b2", @"c3", @"e4", nil];
NSMutableArray *listHolder = list; // can't mutate 'list' within loop so create a holder
for (int i = 0; i < [list count]; i++) {
[listHolder replaceObjectAtIndex:i withObject:[bin objectAtIndex:i]];
}
第二个数组 listHolder 被调用了什么?我的意思是,在这种情况下,用什么术语来指代数组。
答案 0 :(得分:4)
这完全有效:
NSMutableArray *bin = [NSMutableArray arrayWithObjects:@"0", @"1", …, @"7", nil];
NSMutableArray *list = [NSMutableArray arrayWithObjects:@"a1", …, @"e4", nil];
// NSInteger should be used instead of int
for (NSInteger i = 0; i < [list count]; i++) {
[list replaceObjectAtIndex:i withObject:[bin objectAtIndex:i]];
}
您不允许在for … in
或NSEnumerate
循环内更改数组,但使用索引完全有效。
让我感到困扰的是你对指针的误解 如果它是一个不允许变异数组的循环,则不会复制数组,只会复制指向数组的指针,从而有效地修改了不允许的数组。 (我甚至不确定这是否有效。)
而不仅仅是复制指针
// can't mutate 'list' within loop so create a holder
NSMutableArray *listHolder = list;
制作一份真实的副本:
NSMutableArray *copy = [[list mutableCopy] autorelease];
如果我真的需要复制,我会尝试根据其内容命名。例如:
NSMutableArray *views;
NSMutableArray *reorderedViews = [views mutableCopy];
// reorder reorderedViews
有时很难找到一个足够好的名字,然后我通常只使用nameCopy
。
答案 1 :(得分:1)
没有特定的风格或通用名称,这是普遍使用的,它是您的代码,如果适当的条款使用它们。
一般说来,如果你在这种情况下没有特定的名字,那么人们将原始列表称为“源”(src),将最终列表称为“目的地”(dst),就像在内存blitting样式操作。
答案 2 :(得分:1)
在此上下文中,listHolder
将被称为副本。
你的代码有一个bug。这一行实际上并没有复制,只允许listHolder
和list
都引用相同的数组对象:
NSMutableArray *listHolder = list;
这是一个实际的副本:
NSMutableArray *listHolder = [list mutableCopy];
如果您希望副本可变,请确保使用mutableCopy
而不只是copy
。 copy
方法将在所有可变类上返回不可变变量,例如NSMutableSet
,NSMutableDictionary
,等等。
另外,正如其他人已经注意到,只有for (item in collection)
循环内部才能突变枚举的集合。在正常的for (;;)
突变中完全没问题,但如果集合中的项目数量发生变化,可能会导致奇怪的结果。
答案 3 :(得分:0)
原始NSArray的临时可变副本将是我如何引用它。