2017-09-20 4 views
0

J'essaie de comprendre la meilleure mise en œuvre d'un singleton c'est la dernière fois que j'ai obtenu.Implémentation singleton Objective-C

C'est la mise en œuvre fichier .m, quelque chose de mal avec elle:

#import "Foo.h" 

static Foo *object = nil; 

@implementation Foo 

+ (Foo*)sharedObject { 
    return [[Foo alloc] init]; 
} 

- (id)init { 
    static dispatch_once_t once; 
    dispatch_once(&once, ^{ 
     object = [super init]; 
    }); 

    return object; 
} 

@end 

et de l'utiliser, je peux faire:

[Foo sharedObject] 

ou

[[Foo alloc] init] 

Et les deux seront retourne le même objet.

+0

Ce que vous faites est une mauvaise pratique et c'est une mauvaise façon de faire des singletons. 'alloc init' doit toujours renvoyer une instance, pas un singleton alloué paresseux. Voir @isamankumara réponse pour le modèle de codage droit. – Shebuka

+0

Pourquoi dites-vous que c'est un must, je pense que votre (doit) mon ami est l'exact la déférence d'un singleton. et c'est la raison exacte pour laquelle j'ai écrit cette question. singleton est une et une seule instance de cette classe, sinon ce n'est pas un singleton –

Répondre

0

Selon la classe de votre Foo. Pas différent quand vous appelez les deux méthodes. Mais je pense que mieux si vous pouvez changer votre méthode de Foo singleton comme suit

+ (id) sharedObject { 
    static Foo *sharedobj = nil; 
    static dispatch_once_t onceToken; 
    dispatch_once(&onceToken, ^{ 
     sharedobj = [[self alloc] init]; 
    }); 
    return sharedobj; 
} 

- (id)init { 
    if (self = [super init]) { 
     someProperty = [[NSString alloc] initWithString:@"Default Property Value"]; 
    } 
    return self; 
} 

laisse supposer que vous voulez créer nouvelle instance. Mais il ne créera pas en utilisant la méthode alloc car vous surchargez la méthode init.

+0

mon souci à propos de votre solution est que je suis encore capable de créer une instance si j'ai appelé la méthode init, mais avec mon code peu importe si vous avez appelé -init ou + sharedObject il retournera toujours le même objet. et d'après ma compréhension du modèle de conception singleton, vous ne devriez pas être en mesure de créer une autre instance de cette classe de toute façon. –