Singleton objective c clarification

pendant que je continue mes études le livre a mis en application un singleton. J'ai compris la raison pour laquelle je l'utilise, mais je voulais juste une clarification concernant le code.

+ (BNRItemStore *)defaultStore { static BNRItemStore *defaultStore = nil; if(!defaultStore) defaultStore = [[super allocWithZone:nil] init]; return defaultStore; } 

Dans la ligne static BNRItemStore * defaultStore = nil; jusqu'à la déclaration de return. Ma question est; tout le time que j'appelle cette class, [[BNRItemStore defaultStore] someMethod]; dans une autre class ou une partie de l'application, la variable defaultStore sera définie à zéro?

À votre santé

Il est important de comprendre que le mot key static a deux effets. Le premier est qu'il fait exister cette variable avant que la méthode ne soit appelée, et persiste après son return, de sorte qu'elle sera disponible pour l'appel suivant. L'autre effet est plus subtil – l'affectation qui initialise la variable statique est exécutée lorsque le code est chargé, pas lorsque la méthode est appelée. Donc, il ne se réinitialise pas à chaque appel.

Mais puisque la variable existe "en dehors" de la méthode, son nom doit être unique – n'utilisez pas le même nom dans un autre singleton dans cette class ou dans une autre.

C'est l'initialisateur d'une variable avec une durée de stockage statique. La valeur sera définie lorsque l'exécutable est chargé en memory.

Notez qu'il n'est pas nécessaire de définir explicitement la valeur à zéro car toutes les variables avec une durée de stockage statique sont automatiquement définies sur 0.

Pour les variables fonctionnelles-statiques, la ligne

 static BNRItemStore *defaultStore = nil; 

n'est pas une cession . Il s'agit plutôt d' une initialisation statique , qui ne se produit qu'une seule fois – la première fois que le code passe par votre fonction. Dans les invocations suivantes, la valeur ne sera pas nil car vous lui atsortingbuez une valeur non nulle.

Votre implémentation est sûre dans les environnements à un seul thread. Pour les environnements concurrents, vous devez append une forme de synchronisation.

Les variables statiques sont initialisées juste au moment où la fonction / méthode est appelée pour la première fois. Après cela, vous pouvez essentiellement prétendre que la ligne n'existe pas.

Apple recommand quelque chose comme le suivant

 + (BNRItemStore *)defaultStore { static BNRItemStore *defaultStore = nil; static dispatch_once_t done; dispatch_once(&done, ^{ defaultStore = [BNRItemStore alloc]init];}); return defaultStore; } 

Le code ci-dessus suppose ARC – Si vous n'utilisez pas ARC, vous devrez définir ne rien conserver, libérer, autorelease, et les methods dealloc.