Как получить индекс текущего объекта в итерации NSEnumerator?
Вопрос: Как получить индекс текущего объекта в итерации NSEnumerator?
(Я не хочу отслеживать вещи, используя целочисленный счетчик или цикл for из-за соображений скорости. Я сделал это прежде, чем просто не могу вспомнить, как я это сделал...)
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:
сообщение (которое может включать в себя дальнейшую отправку сообщения).
Вы запрашиваете индекс, поэтому мы можем предположить, что вы используете массив. Если так:
[array indexOfObject:currentObject];
будет работать в большинстве случаев (но не во всех). Однако в целом было бы быстрее перейти к использованию обычного цикла for со счетчиком int.