Objective-C - 对数组子集的快速枚举?

时间:2011-06-11 16:17:02

标签: iphone objective-c ios collections nsarray

是否有一种简单的方法可以对数组中的一系列对象进行快速枚举?有点像...

for (Object *object in myArray startingAtIndex:50) {
    //do stuff
}

......避免做这样的事......

for (Object *object in myArray) {
    NSUInteger index = [myArray indexOfObject:object];
    if (index >= 50) {
        //do stuff
    }
}

感谢。

2 个答案:

答案 0 :(得分:6)

如果myArray是不可变的,那么subArrayWithRange: 可能不会复制指针,但retain 可能仍然必须发送到子阵列中的所有内容。

总的来说,这没关系。我老实说从来没有见过快速枚举与indexOfObject:足以引起注意的性能问题的情况(总是存在更糟糕的情况。)。

另一种方法;使用enumerateBlock:并简单地从索引返回游侠(并使用停止标志)。

[myArray enumerateWithBlock: ^(id o, NSUInteger i, BOOL *f) {
   if (i < 10) return;
   if (i > 20) { *f = YES; return; }
   ... process objects in range ...
}];

(您甚至可以使用options:变体同时枚举。)

答案 1 :(得分:5)

我想到了这些:

for (Object *object in [myArray subArrayWithRange:NSMakeRange(50, ([myArray count] - 49))]) {
    //do stuff
}

虽然创建了一个临时数组,因此可能比这样的手动枚举更慢(基准测试!):

NSUInteger arrayCount = [myArray count];
for (NSUInteger i = 50; i < arrayCount; i++) {
    Object *object = [myArray objectAtIndex];
    // do stuff
}