Я привел бы доводы в пользу использования makeObjectsPerformSelector
, так как оно позволяет объекту NSSet заботиться о его собственной индексации, цикличном выполнении и диспетчеризации сообщения. Люди, которые написали код NSSet, скорее всего, будут знать лучший способ реализовать тот конкретный цикл.
В худшем случае, они просто реализовали бы тот же самый цикл и все, что Вы получаете, немного более чистый код (никакая потребность в цикле включения). В лучшем случае они сделали некоторую внутреннюю оптимизацию, и код будет на самом деле работать быстрее.
тема кратко упоминается в Быстродействии Кода Apple документ в разделе, названном, "Разворачивая Циклы".
, Если Вы обеспокоены производительностью, лучшая вещь сделать настраивается быстрая программа, которая выполняет некоторый селектор на объектах в наборе. Имейте его, выполняет несколько миллионов раз, и время различие между двумя различными случаями.
makeObjectsPerformSelector:
могло бы быть немного быстрее, но я сомневаюсь, там будет любым практическим различием 99% времени. Это немного более кратко и читаемо, хотя, я использовал бы его по этой причине.
Я не использовал бы makeObjectsPerformSelector по простой причине, что это - вид вызова, что Вы не видите все настолько часто. Вот то, почему, например - я должен добавить код отладки, поскольку массив перечисляется, и Вы действительно не можете сделать этого с makeObjectsPerformSelector, если Вы не изменяетесь, как код работает в режиме Release, который является реальным нет нет.
for (id item in mySetOfObjects)
{
#if MY_DEBUG_BUILD
if ([item isAllMessedUp])
NSLog(@"we found that wily bug that has been haunting us");
#endif
[item action];
}
- Tom