2013-04-19 2 views
0

J'essaie de mettre en œuvre modèle de conception singleton dans l'objectif C. Voici mon codemise en œuvre Singleton dans l'objectif C

Dans le fichier .h

#import <Foundation/Foundation.h> 
@interface BSCustomClass : NSObject 
{ 
    NSString *string; 
} 
@property (nonatomic,strong)NSString *string; 
@end 

Dans le fichier .m

#import "BSCustomClass.h" 
@implementation BSCustomClass 
static int i; 
static BSCustomClass* object; 
@synthesize string; 
-(id)init 
{ 
    if(i==0) 
    { 
     object=[super init]; 
     i=1; 
     [email protected]"tunvir Rahman";  
    } 
    return object; 
} 
@end 

Maintenant, si je veux créer un objet de BSCustomClass à partir de main en utilisant alloc et init, il appelle sa propre méthode init et vérifie la variable statique i. Si i = 0 alors il est supposé qu'aucun objet n'est créé jusqu'à présent et créer un objet et après cela il retournera l'adresse de l'objet précédent pour tout objet pour la classe BSCustomClass. Est-ce une implémentation correcte de singleton ?? Merci

+0

initialiser 'static int i;' comme 'static int i = 0;' – viral

Répondre

4

Vous devriez utiliser dispatch_once au lieu du static int et une méthode de classe comme « singleton » ou « sharedInstance » au lieu de alloc-init. Pour une explication plus détaillée, je vous renvoie "Singletons: You're doing them wrong". Code de ce poste

+(MyClass *)singleton { 
    static dispatch_once_t pred; 
    static MyClass *shared = nil; 

    dispatch_once(&pred, ^{ 
     shared = [[MyClass alloc] init]; 
    }); 
    return shared; 
} 
+0

Merci David pour votre réponse. –

0

singletons sont mises en œuvre dans Objective-C comme ceci:

+(id)sharedInstance { 
    static id instance = NULL; 
    if (instance == NULL) instance = [[YourClassName alloc] init]; 
    return instance; 
} 

S'il y a une chance qu'il pourrait être appelé à partir de plusieurs threads, utilisez la solution de David à la place.

+0

Dans beaucoup de blog j'ai été suggéré d'éviter singleton. Mais cela me semble très utile! si je veux passer des données entre object singleton est très utile et je pense que très efficace. Y a-t-il des détails à ce sujet? Merci. –