应该尽可能避免反转NSMutableArray吗?

时间:2011-09-13 22:04:36

标签: objective-c cocoa-touch nsmutablearray enumeration

假设我有1到450的NSNumbers。我可以选择将它们添加到NSMutableArray中,从1开始到450结束,或从450开始到1结束。如果我可以开始,我的代码会更简单一些1,以450结束,但是当我最终计算出数组时,我最终需要反转它。换句话说,我需要枚举中的第一个对象为450,最后一个对象为1.

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

  

使用快速枚举协议更有效(参见   NSFastEnumeration)。 Mac OS X v10.5上提供快速枚举   以及后来的iOS 2.0及更高版本。

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

2 个答案:

答案 0 :(得分:7)

您可以对NSEnumerator实例使用快速枚举,关于快速枚举的documentation甚至使用reverseObjectEnumerator:方法作为示例:

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

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

答案 1 :(得分: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
}