Как получить индекс текущего объекта в итерации NSEnumerator? - PullRequest
3 голосов
/ 19 мая 2010

Вопрос: Как получить индекс текущего объекта в итерации NSEnumerator?

(я не хочу отслеживать вещи с помощью целочисленного счетчика или использовать цикл for по причинам скоростиЯ делал это раньше, я просто не могу вспомнить, как я это сделал ...)

Ответы [ 2 ]

2 голосов
/ 19 мая 2010

Сомнительно, что использование целочисленного счетчика в цикле 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 голос
/ 19 мая 2010

Вы запрашиваете индекс, поэтому мы можем предположить, что вы используете массив. Если так:

[array indexOfObject:currentObject];

будет работать в большинстве случаев (но не во всех). Однако в целом было бы быстрее перейти к использованию обычного цикла for со счетчиком int.

...