2011-03-02 9 views

Respuesta

29

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.

+7

... 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

0
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.

+1

Esto es solo azúcar sintáctico, no responde por qué uno es más rápido que el otro. – shreyasva

+0

oh lo siento, no leí tu pregunta completa. – Robin

2

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; 
} 
Cuestiones relacionadas