【问题标题】:Should reversing an NSMutableArray be avoided when possible?是否应该尽可能避免反转 NSMutableArray?
【发布时间】:2011-11-16 13:41:29
【问题描述】:

假设我的 NSNumbers 为 1 - 450。我可以选择将它们添加到 NSMutableArray 中,或者以 1 开头并以 450 结尾,或者以 450 开头并以 1 结尾。如果我可以从1 并以 450 结尾,但是当我终于要枚举数组时,我最终需要反转它。换句话说,我需要枚举中的第一个对象为 450,最后一个为 1。

如果我这样做,我的代码会更简单(从 1 开始添加,然后在枚举之前反转它),这是我的首选方法。但是,- (NSEnumerator *)reverseObjectEnumerator 的 Apple 文档说:

使用快速枚举协议效率更高(参见 NSFast枚举)。快速枚举在 Mac OS X v10.5 上可用 及更高版本和 iOS 2.0 及更高版本。

那么我是否应该避免数组反转并简单地编写稍微复杂的代码,以便首先按所需顺序创建 NSMutableArray?

【问题讨论】:

标签: objective-c cocoa-touch nsmutablearray enumeration


【解决方案1】:

您可以将快速枚举与NSEnumerator 实例一起使用,关于快速枚举的documentation 甚至以reverseObjectEnumerator: 方法为例:

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

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

【讨论】:

  • 谢谢,我现在知道我误解了文档中导致我提出此问题的行。这似乎是过早的优化,但我知道我正在做的事情已经存在优化问题,因为涉及的循环太多。
【解决方案2】:

不,您不需要编写更复杂的代码来将其按正确的顺序排列。 reverseObjectEnumerator 可以正常工作,只是稍微慢一些。如果性能是一个大问题,下面的任何一个 sn-ps 都可以正常工作(两者中更快的是 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
}

【讨论】:

    猜你喜欢
    • 2020-10-05
    • 1970-01-01
    • 2016-03-26
    • 1970-01-01
    • 1970-01-01
    • 2020-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多