10
votes

Énumération rapide vs nsenumerator dans l'objectif-c

J'ai vu cela encore et encore, pourquoi exactement est plus rapide d'utiliser une énumération rapide dans des boucles plutôt que d'un Nsenumerator à l'aide de NextObject: . .


0 commentaires

3 Réponses :


0
votes
for(NSArray array2 in array)
{
   // do what ever you want with this new array2.
}

1 commentaires

Ceci est juste syntaxique-sucre, il ne répond pas pourquoi on est plus rapide que l'autre.



29
votes

nsenumerator code> est l'ancienne façon d'énumérer sur les collections. Il s'agit de créer un objet pour représenter l'énumération, puis appelant une méthode à ce sujet pour chaque itération. Bien que cela soit parfaitement utilisable pendant de nombreuses années, ce n'est pas terriblement efficace, car il implique au moins un message de message pour chaque itération de la boucle. NSFASTENUMERATION CODE> est l'approche la plus moderne, qui exploite un soutien de langue maternelle pour fournir une énumération beaucoup plus efficace. La façon dont il fonctionne sous la hotte est-elle crée une structure qui représente l'état de dénombrement actuel et appelle à plusieurs reprises -CountbyNumeratingwithState: Objets: Compte: code> sur la collection. Cette méthode renvoie une gamme C d'objets dans les objets code> Out-param, ainsi qu'un compteur dans le compte Nombre code> Out-param. Cela permet à l'appelant de parcourir ensuite le tableau C. En substance, cela signifie qu'un appel de message par morceau d'objets, qui, selon la collection, pourrait être aussi efficace qu'un appel de message unique pour obtenir tous les objets.

Si vous avez un peu de code qui ressemble à p >

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];
    }
}


1 commentaires

... et énumérantObjectSusingBlock: va être aussi rapide (NSARRAY) ou beaucoup plus rapide (NSDictionary lors de l'énumération des valeurs) puis de l'énumération rapide ....



2
votes

0 commentaires