He visto esto una y otra vez, ¿por qué exactamente es más rápido utilizar la enumeración rápida en bucles en lugar de NSEnumerator
usando nextObject:
.Enumeración rápida Vs NSEnumerator en Objective-C
Respuesta
NSEnumerator
es la forma antigua de enumerar las colecciones. Implica crear un objeto para representar la enumeración, y luego llamar a un método para cada iteración. Si bien esto fue perfectamente útil durante muchos años, no es terriblemente eficiente, ya que implica al menos un mensaje de envío para cada iteración del ciclo. NSFastEnumeration
es el enfoque más moderno, que aprovecha el soporte del idioma nativo para proporcionar una enumeración mucho más eficiente. La forma en que funciona bajo el capó es que crea una estructura que representa el estado de enumeración actual y llama repetidamente al -countByEnumeratingWithState:objects:count:
en la colección. Este método devuelve una matriz C de objetos en el objects
out-param y un contador en el count
out-param. Esto permite que la persona que llama luego itere sobre la matriz C. En esencia, esto significa una llamada de mensaje por porción de objetos, que, dependiendo de la colección, podría ser tan eficiente como una llamada de un solo mensaje para obtener todos los objetos.
Si usted tiene un poco de código que se parece a
for (id obj in myArray) {
[obj doSomething];
}
Esto se traduce por el compilador en algo más o menos equivalente a
NSFastEnumerationState __enumState = {0};
id __objects[MAX_STACKBUFF_SIZE];
NSUInteger __count;
while ((__count = [myArray countByEnumeratingWithState:&__enumState objects:__objects count:MAX_STACKBUFF_SIZE]) > 0) {
for (NSUInteger i = 0; i < __count; i++) {
id obj = __objects[i];
[obj doSomething];
}
}
Las variables reales usados están ocultos, y el tamaño máximo del buffer de objeto también depende de la implementación, pero la idea básica está ahí. Traduce la iteración sobre una colección obj-c en iteración sobre una matriz C.
NSArray *array = something;
array = {{1,2}, {2,3}, {3,4}}
que significa matriz es una matriz de matriz. Entonces, ¿cómo puede acceder a todas las matrices y sus valores? podemos utilizar para el lazo como esto
for (int i = 0; i < array.count; i++)
{
NSArray x = [array objectAtIndex:i];
}
o una enumeración rápida funciona así
for(NSArray array2 in array)
{
// do what ever you want with this new array2.
}
este es un ejemplo de muestra.
PS. Olvidé cómo se ve la matriz en la consola.
GNUstep libs/base/trunk/Source/NSEnumerator.m countByEnumeratingWithState: objetos: Recuento:
No es igual que la aplicación de Apple pero es útil para entender.
- (NSUInteger) countByEnumeratingWithState: (NSFastEnumerationState*)state
objects: (id*)stackbuf
count: (NSUInteger)len
{
IMP nextObject = [self methodForSelector: @selector(nextObject)];
int i;
state->itemsPtr = stackbuf;
state->mutationsPtr = (unsigned long*)self;
for (i = 0; i < len; i++)
{
id next = nextObject(self, @selector(nextObject));
if (nil == next)
{
return i;
}
*(stackbuf+i) = next;
}
return len;
}
- 1. Enumeración rápida en un NSIndexSet
- 2. Enumeración rápida en NSArray de diferentes tipos
- 3. enumeración vs inmutable en D
- 4. Enumeración Java vs iterador
- 5. ¿Cómo se detiene la enumeración rápida?
- 6. Objective-C enumerateUsingBlock versus enumeración rápida?
- 7. Cómo declarar un valor de enumeración que está obsoleto en ObjectiveC (2.0)
- 8. Mantenga un registro de índice en la enumeración rápida
- 9. Enumeración rápida en una categoría NSArray para NSIntegers
- 10. Bloques ObjectiveC equivalente en Java
- 11. Enumeración de dos miembros vs. valor booleano
- 12. Ejemplo de adopción/implementación de enumeración rápida para mi clase?
- 13. Cocoa NSArray/NSSet: -makeObjectsPerformSelector: frente a la enumeración rápida
- 14. Enumeración rápida con un NSMutableArray que contiene un NSDictionary
- 15. objectivec: fb publicar comentario error
- 16. ObjectiveC Parse Integer from String
- 17. Objetivo c "para cada uno" (enumeración rápida) - evaluación de la colección?
- 18. Enumeración Ámbito
- 19. caso interruptor de Java - por defecto vs enumeración explícita
- 20. MySQL rendimiento de las consultas dilema: enumeración vs tablas
- 21. Get enumeración de atributos enumeración
- 22. enviar una notificación desde javascript en UIWebView a ObjectiveC
- 23. Cómo dividir la nueva línea de NSString en ObjectiveC
- 24. ¿Cómo implementar un puente sin cargo en ObjectiveC/C?
- 25. obteniendo el error "invalid_client" en la muestra gdata-objectivec-client
- 26. ¿Puedo colocar un ObjectiveC @selector en un NSDictionary?
- 27. Pros y contras del uso de excepción en IOS/ObjectiveC
- 28. enumeración formato en gridview
- 29. banderas enumeración en JavaScript
- 30. Conmutación enumeración en FreeMarker
... y 'enumerateObjectsUsingBlock:' va a ser igual de rápido (NSArray) o significativamente más rápido (NSDictionary al enumerar valores) y luego enumeración rápida .... – bbum