代码之家  ›  专栏  ›  技术社区  ›  willc2

目标C中有关贯穿NSARRAY的术语问题

  •  0
  • willc2  · 技术社区  · 17 年前

    当您有一个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]];
    }
    

    第二排是什么 老年人 打电话?我的意思是,在这种情况下,用什么术语来指数组?

    4 回复  |  直到 17 年前
        1
  •  1
  •   PeyloW    17 年前

    在这种背景下 listHolder 会被称为 复制 .

    但是您的代码有一个错误。这一行实际上不是在复制,它只是让 老年人 list 两者都引用同一数组对象:

    NSMutableArray *listHolder = list;
    

    这将是一份真实的副本:

    NSMutableArray *listHolder = [list mutableCopy];
    

    确保使用 mutableCopy 而不仅仅是 copy 如果你想拷贝是可变的。这个 复制 方法将在所有可变类(如 NSMutableSet , NSMutableDictionary 等等。

    另外,正如其他人所指出的,它只在 for (item in collection) 枚举集合不能变异的循环。在正常情况下 for (;;) 突变是完全正常的,但是如果集合中的项目数发生变化,可能会导致奇怪的结果。

        2
  •  4
  •   Georg Schölly Crazy Developer    17 年前

    这是完全有效的:

    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 .

        3
  •  1
  •   Louis Gerbarg    17 年前

    没有具体的风格或通用名称是普遍使用的,这是你的代码毕竟,如果他们有适当的术语使用它们。

    已经说过,一般情况下,如果在这种情况下没有特定的名称,那么人们将原始列表称为“源”(SRC),将最终列表称为“目标”(DST),就像在内存块式操作中一样。

        4
  •  0
  •   Xetius    17 年前

    一个临时可变的原始NSARRAY副本将是我如何提到它。

    推荐文章