2011-09-13 45 views
4

假设我有NSNumbers 1 - 450.我可以选择将它们添加到NSMutableArray,从1开始,以450结尾,或从450开始,以1结尾。如果我可以从1开始,我的代码会更简单一些并以450结尾,但是当我最终想要列举数组时,我最终需要将其反转。换句话说,我需要枚举中的第一个对象为450,最后一个为1.应尽可能避免反转NSMutableArray?

由于我的代码会更简单,如果我这样做(从1开始,然后将其颠倒过来枚举),这是我的首选方法。然而,对于- (NSEnumerator *)reverseObjectEnumerator苹果的文件说:

更有效地使用快速枚举协议(见 NSFastEnumeration)。在Mac OS X v10.5 及更高版本和iOS 2.0及更高版本上提供快速枚举。

因此,我应该避免数组反转,并简单地写一些更复杂的代码,以便首先创建NSMutableArray按所需的顺序?

+1

退房快速列举澄清:你如何枚举倒退?在http://cocoawithlove.com/2008/05/fast-enumeration-clarifications.html – albertamg

+0

你应该在这个代码上展示代码,因为很难说出你在创建数组时遇到了什么样的复杂问题。 –

回答

7

您可以使用快速列举与NSEnumerator例如,documentation关于快速列举甚至使用reverseObjectEnumerator:方法作为例子:

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

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

+0

谢谢,我现在看到我误解了文档中引起我提出这个问题的一行。这可能看起来像不成熟的优化,但我知道我正在做什么已经有优化问题,因为有太多的循环涉及。 – 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 
}