40 votes

Comment créer une classe singleton dans l'objectif C

Comment puis-je créer une classe singleton dans Objective C?

53voto

John Doe Points 473

Ok appDev, vous trouverez probablement assez quelques techniques pour ce faire sur le web. Toutefois, pour l'application iOS de développement, je pense que le moyen le plus pratique est de faire ce qui suit:

  • Écrivez votre méthode(s) pour obtenir l'objet singleton. (Recommandation: utiliser dispatch_once fil et PGCD pour cela).

  • Enveloppez votre méthode(s) dans une macro et l'ajouter à votre $Project$-Prefix.pch le fichier.

  • Appel de la macro lorsque vous avez besoin d'objet singleton pour une classe.

Exemple:

CommonMacros.h:

#define SINGLETON_FOR_CLASS(classname)\
+ (id) shared##classname {\
    static dispatch_once_t pred = 0;\
    __strong static id _sharedObject = nil;\
    dispatch_once(&pred, ^{\
        _sharedObject = [[self alloc] init];\
    });\
    return _sharedObject;\
}

Votreprojet-Préfixe.pch:

...
#import "CommonMacros.h"
...

YourSingletonClass.m:

...
SINGLETON_FOR_CLASS(YourSingletonClass)
...

27voto

Sachin Shanbhag Points 20979

Consultez ce lien pour la source d'origine - http://getsetgames.com/2009/08/30/the-objective-c-singleton/

 @implementation MySingleton
static MySingleton* _sharedMySingleton = nil;

+(MySingleton*)sharedMySingleton
{
    @synchronized([MySingleton class])
    {
        if (!_sharedMySingleton)
            [[self alloc] init];

        return _sharedMySingleton;
    }

    return nil;
}
 

22voto

Abhijit Points 21

Je pense que c'est ainsi que nous pouvons vraiment atteindre un comportement singleton:

 @interface SampleSingletonClass : NSObject

+ sharedSampleSingletonClass;

@end


@implementation SampleSingletonClass
static SampleSingletonClass *singletonObject = nil;

+ (id) sharedSampleSingletonClass
{
    if (! singletonObject) {

        singletonObject = [[SampleSingletonClass alloc] init];
    }
    return singletonObject;
}

- (id)init
{
    if (! singletonObject) {

        singletonObject = [super init];
    // Uncomment the following line to see how many times is the init method of the class is called
    // NSLog(@"%s", __PRETTY_FUNCTION__);
    }
    return singletonObject;
}

@end
 

Ici même si l'on appelle la méthode init au lieu du + (id) SampleSingletonClass prévu; méthode, l'objet réel est formé une seule fois tout au long du cycle de vie de l'application.

11voto

Amulya Points 66

Vous pouvez implémenter une classe singleton dans Objective-C.

 + (id)sharedManager {
    static MyManager *sharedMyManager = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        sharedMyManager = [[self alloc] init];
    });
    return sharedMyManager;
}

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

http://www.galloway.me.uk/tutorials/singleton-classes/

4voto

Rajkumar Yadav Points 58

Essaye ça

Fichier .h de classe Singalton

 #import <Foundation/Foundation.h>

@interface GlobleDirector : NSObject
+(GlobleDirector*)shareManager;
@end
 

Fichier .m de classe Singalton

 #import "GlobleDirector.h"

@implementation GlobleDirector


+(GlobleDirector*)shareManager{

static GlobleDirector *sharedInstance=nil;
static dispatch_once_t  oncePredecate;

dispatch_once(&oncePredecate,^{
    sharedInstance=[[GlobleDirector alloc] init];

 });
return sharedInstance;
}



@end
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X