Je me demandais où est le meilleur endroit pour initialiser les membres de la classe singleton. J'utilise Apple mise en œuvre singleton guide fondamental. Pourriez-vous s'il vous plaît préciser à quelle ligne les inits se produisent? Le code est le suivant:Cocoa - Objet Singleton: Où initialiser les variables membres?
static MyGizmoClass *sharedGizmoManager = nil;
+ (MyGizmoClass*)sharedManager
{
@synchronized(self) {
if (sharedGizmoManager == nil) {
[[self alloc] init]; // assignment not done here
}
}
return sharedGizmoManager;
}
+ (id)allocWithZone:(NSZone *)zone
{
@synchronized(self) {
if (sharedGizmoManager == nil) {
sharedGizmoManager = [super allocWithZone:zone];
return sharedGizmoManager; // assignment and return on first allocation
}
}
return nil; //on subsequent allocation attempts return nil
}
- (id)copyWithZone:(NSZone *)zone
{
return self;
}
- (id)retain
{
return self;
}
- (unsigned)retainCount
{
return UINT_MAX; //denotes an object that cannot be released
}
- (void)release
{
//do nothing
}
- (id)autorelease
{
return self;
}
Vous voudrez peut-être lire http://boredzo.org/blog/archives/2009-06-17/doing-it-wrong. Voulez-vous vraiment un singleton qui annule la libération? Cela ne fait que masquer les bugs. –
Et avant que vous rappelez à Jon Hess que vous suivez les docs d'Apple: j'ai écrit ce post spécifiquement en réponse aux docs d'Apple. –
Il convient également de noter que les classes n'ont aucun "membre" d'aucune sorte. Le plus proche que vous pouvez obtenir est une variable statique dans le fichier d'implémentation de la classe. Et les membres de classe ne sont pas ce que vous voulez initialiser de toute façon. Ce que vous vouliez dire, c'est les variables * instance * de l'instance de singleton *. –