2009-07-16 7 views
0

J'ai trouvé cet extrait de code sur le net. Il établit un NSMutableArray d'une manière que je n'ai pas vue auparavant (je suis un newb Obj-C). Quelqu'un peut-il expliquer ce qu'il fait et pourquoi vous le feriez de cette façon? Particulièrement le signe @syncronized, static et little plus sur la signature de la méthode.Configuration de NSMutableArray - Quelqu'un peut-il expliquer ce que fait cet extrait de code?

add the following to the .h file: 
+(NSMutableArray *)allMySprites; 

add the following to he .m file after implementation: 

static NSMutableArray * allMySprites = nil; 

+(NSMutableArray *)allMySprites { 
    @synchronized(allMySprites) { 
     if (allMySprites == nil) 
      allMySprites = [[NSMutableArray alloc] init]; 
     return allMySprites; 
    } 
return nil; 

}

Répondre

6

Ajout à l'autre réponses ... le code affiché est faux. Cela devrait ressembler plus à ceci:

Cela n'a aucun sens de @synchroniser sur zéro. L'utilisation de self dans une méthode de classe fait référence à la classe et non à l'instance. De plus, le «return nil» dans le code original est inutile.

Une meilleure approche où le @synchronized peut être complètement évitée est d'utiliser une méthode d'initialisation de classe:

@implementation SomeClass 
+ (void) initialize 
{ 
    allMySprites = [[NSMutableArray alloc] init]; 
} 
@end 

Les méthodes initialize sont garantis d'être appelé avant la classe est utilisée.

+0

+1 pour le remarquer –

+2

+ l'initialisation peut être appelée plus d'une fois si vous avez des sous-classes. Il est préférable de vérifier que vous initialisez votre classe comme suit: if (self == [classe SpriteManager]) { allMySprites = [[NSMutableArray alloc] init]; } –

1

Le signe + indique la méthode est static par opposition aux méthodes instance. Cela signifie que la méthode appartient à la classe plutôt qu'à chaque instance d'une classe (comme static things in Java and C#). @synchronized acquiert un verrou sur l'objet spécifié (like lock statement in C#). Cela signifie qu'aucun autre thread ne peut entrer dans un bloc @synchronized avec cet objet.

Le code dans son ensemble tente d'initialiser une collection singleton la première fois (quand il n'est pas encore initialisé) et de le mettre en cache pour une utilisation dans les appels ultérieurs à cette méthode. Le bloc synchronisé crée un critical section pour sécuriser la partie d'initialisation dans le cas d'une condition de concurrence dans laquelle deux threads tentent d'obtenir la valeur à peu près en même temps pendant l'initialisation.

1

C'est une implémentation du Singleton design pattern, essentiellement un moyen de s'assurer que vous avez seulement une copie de votre MySprites.

Les détails:

  • Le + signifie que ceci est une méthode de classe
  • Le @syncyronize rend l'accès à la allMySprites variables thread-safe (il y a quelques mises en garde, mais c'est le résumé d'une ligne)
  • Je crois que les static limite la portée de la variable uniquement au fichier
Questions connexes