在可能的情况下,是否应避免反转NSMutableArray?

4
假设我有从1到450的NSNumbers。我可以选择将它们添加到NSMutableArray中,要么从1开始,以450结束,要么从450开始,以1结束。如果我能从1开始到450结束,我的代码会更简单,但当我最终枚举数组时,我最终需要反转它。换句话说,我需要枚举中的第一个对象是450,最后一个对象是1。
既然我的代码用这种方式(从1开始添加,然后在枚举之前反转它)会更简单,那么这是我首选的方法。然而,Apple文档中的`-(NSEnumerator *)reverseObjectEnumerator`指出:
“使用快速枚举协议(请参阅NSFastEnumeration)更有效。 快速枚举在Mac OS X v10.5及更高版本和iOS 2.0及更高版本上可用。”
所以,我应该避免数组反转,并编写略微复杂一些的代码,以便在第一次创建NSMutableArray时按所需顺序进行吗?

1
请查看“快速枚举澄清:如何反向枚举?”网址为http://cocoawithlove.com/2008/05/fast-enumeration-clarifications.html。 - albertamg
你应该在这个问题上展示代码,因为很难确定你在数组创建方面所说的复杂性是什么。 - jscs
2个回答

7

您可以使用NSEnumerator实例进行快速枚举,在关于快速枚举的文档中,甚至使用reverseObjectEnumerator:方法作为示例:

NSEnumerator *enumerator = [array reverseObjectEnumerator];
for (NSString *element in enumerator) {
    //...
}

此外,你的问题听起来很像过早优化...

谢谢,我现在明白了,是文档中的那一行让我误解了,导致我提出了这个问题。这可能看起来像是过早优化,但我知道我正在做的事情已经存在优化问题,因为涉及到很多循环。 - maxedison

1

不需要编写更复杂的代码来将其放入正确的顺序中。reverseObjectEnumerator 将正常工作,只是稍微慢一些。如果性能是一个重要问题,下面的任何一个片段都可以很好地工作(其中速度较快的是 while 循环)。

// Assuming 'array' is your NSMutableArray
int i = [array count];
while(i--) {
  Object *current = [array objectAtIndex:i];
  // Mess around with current
}

这将从450开始,并以0结束。你也可以用for循环来做,不过你需要确保要么从索引449开始,要么做一些像这样的事情

for(int i = [array count]; i > 0 ; i--) {
  Object *curreyt = [array objectAtIndex:i-1];
  // Mess around with current
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接