2010-08-12 12 views
2

J'ai un objet qui est initié dans mon fichier nib. Je veux que ce soit un singleton mais aussi accessible du code à travers [myClass sharedInstance];. En ce moment, j'ai ceci:Appel de l'objet singleton initié à partir de la plume

static myClass *singleton = nil; 

@implementation myClass 
+ (myClass *)sharedInstance 
{ 
    if (!singleton) singleton = [[self class] new]; 
    return singleton; 
} 

+ (id)alloc 
{ 
    return [self sharedInstance]; 
} 

- (id)init 
{ 
    if ([self class] != nil) 
     self = [super init]) 
    return self; 
} 
@end 

Mais alloc ne sera jamais appelé.

+0

Je ne sais pas pourquoi votre méthode 'alloc' n'est pas appelée (peut-être avez-vous besoin de surcharger' allocWithZone: '), mais cela ne va-t-il pas poser problème? Quand 'alloc' appelle' sharedInstance', cela va entraîner un autre appel à 'alloc', et ainsi de suite indéfiniment. – David

+0

Il semble que j'ai vraiment besoin de allocWithZone: et que j'ai une boucle infinie. – Jane

+0

Pour résoudre la boucle infinie, vous pourriez avoir une variable d'indicateur qui indiquait si le singleton était en train d'être créé. 'sharedInstance' le définirait, et' alloc' le vérifierait. Si elle était définie, 'alloc' appelait' [super alloc] '. – David

Répondre