Comment puis-je créer une classe singleton dans Objective C?
Réponses
Trop de publicités?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)
...
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;
}
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.
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;
}
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