de travail en C# et Java, j'ai vu au fond d'une façon tout le monde initialise singletons:différentes façons d'initialiser singletons
static obj _inst = null;
obj getInstance() {
if (_inst == null) {
_inst = new obj();
}
return _inst;
}
Maintenant, quand je passe à Objective-C pour l'iPhone, chaque fois que je vois des exemples de code , je vois essentiellement la même chose:
static obj _inst = nil;
+ (obj *) sharedObj {
if (!_inst) {
_inst = [[obj alloc] init];
}
return _inst;
}
il y a une méthode de classe +initialize
qui est appelée à chaque classe dans l'exécution Objective-C avant qu'il ne soit utilisé. Y a-t-il une raison pour laquelle je ne pourrais pas l'utiliser pour créer mes singletons?
static obj _inst = nil;
+ (void) initialize {
if (self == [obj class]) {
_inst = [[obj alloc] init];
}
}
+ (obj *) sharedObj {
return _inst;
}
Il fonctionne très bien quand je l'essayer dans mon code, et il se débarrasse de vérifier pour voir si elle existe à chaque fois avant qu'il ne soit accessible. Y a-t-il une raison pour laquelle je ne devrais pas créer des singletons de cette façon?
sauf que + initialize n'est appelée que la première fois que la classe est accédée. –
Bon point. Je me suis trompé. –
Juste pour souligner qu'il y a un cas (et c'est vraiment un cas de bord ici) que + initialize peut être appelé plus d'une fois. Prenez l'exemple de la classe A et de la classe B étant une sous-classe de la classe A. La classe A implémente + initialise, mais pas la classe B. Lorsque l'initialisation + est envoyée à la classe B, parce qu'elle n'implémente pas la sienne, l'implémentation de + l'initialisation de la super-classe (classe A) est utilisée. Et donc + l'intialize de classe A a été appelé plus d'une fois. Quoi qu'il en soit, votre enregistrement + initialisation est suffisant pour que cela ne vous affecte plus. Juste le mettre là pour la connaissance et l'exhaustivité. :) –