【问题标题】:Terminology question regarding looping thru an NSArray in Objective-C关于在 Objective-C 中通过 NSArray 循环的术语问题
【发布时间】:2009-09-16 09:44:55
【问题描述】:

当您有一个 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 叫什么?我的意思是,在这种情况下使用什么术语来指代数组。

【问题讨论】:

  • 您的意思是制作binlist NSArrays?
  • 这会改变你对问题的回答吗?

标签: objective-c terminology


【解决方案1】:

这是完全有效的:

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 … inNSEnumerate 循环内更改数组,但使用索引是完全有效的。

困扰我的是你对指针的误解。
如果它是一个不允许您更改数组的循环,则不会复制数组,而只会复制指向数组的指针,从而有效地修改您不允许更改的数组。 (我什至不确定这是否有效。)

而不仅仅是复制指针

// 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

【讨论】:

  • 这是有用的信息,谢谢你,但你没有回答这个问题。我选择了一个糟糕的代码示例并偏离了问题。至少我学到了一些东西。
【解决方案2】:

在这种情况下,listHolder 将被称为副本

您的代码有一个错误。这一行实际上并没有复制,它只是让listHolderlist 都引用同一个数组对象:

NSMutableArray *listHolder = list;

这将是一个实际的副本:

NSMutableArray *listHolder = [list mutableCopy];

如果您希望副本是可变的,请确保使用mutableCopy 而不仅仅是copycopy 方法将返回所有可变类的不可变变体,例如 NSMutableSetNSMutableDictionary 等。

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

【讨论】:

  • 感谢您的错误捕获。我通常尽可能使用(集合中的项目)并选择一个糟糕的代码示例。我很高兴我这样做了,因为它暴露了我对指针的思考中的一个错误。
【解决方案3】:

没有普遍使用的特定风格或通用名称,它毕竟是你的代码,如果有合适的术语使用它们。

话虽如此,通常如果您在这种情况下没有特定名称,那么人们将原始列表称为“源”(src),将最终列表称为“目的地”(dst),就像在一个内存块式操作。

【讨论】:

    【解决方案4】:

    原始 NSArray 的临时可变副本将是我引用它的方式。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-02-25
      • 1970-01-01
      • 2011-03-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多