如何在NSEnumerator迭代中获取当前Object的索引?

时间:2010-05-19 13:06:00

标签: iphone c objective-c xcode nsenumerator

问题:如何在NSEnumerator迭代中获取当前Object的索引?

(由于速度原因,我不想使用整数计数器跟踪事物或使用for循环。我之前做错了,我不记得我是怎么做的......)

2 个答案:

答案 0 :(得分:2)

for循环中使用整数计数器会导致速度问题,这是值得怀疑的。尝试从枚举器中查找给定对象的索引比仅仅保留索引记录更可能更慢。如果您想绕过重复的消息调度,请查看NSArray的getObjects:range:方法。

size_t count = [myArray count];
id *objects = calloc(count, sizeof(id));

[myArray getObjects:objects range:NSMakeRange(0, count)];

// if you have a very large count, you'll save doing an
// "objectAtIndex:" for each item.

for (int i = 0; i < count; i++)
    [objects[i] doSomething];

free(objects);

您可能只会看到令人难以置信的大型阵列的最小性能差异,但不要低估引擎盖下的优化。甚至getObjects:range:的文档也不鼓励为此目的使用这种技术。

NSArray的indexOfObject:将迭代所有元素,直到从YES消息返回isEqual:(可能包括进一步的消息发送)。

答案 1 :(得分:1)

您要求索引,因此我们可以假设您正在使用数组。如果是这样的话:

[array indexOfObject:currentObject];

适用于大多数情况(但不是全部)。但是,总体来说,切换到使用带有int计数器的正常for循环会更快。