Objective-C Language
Singletons
Ricerca…
introduzione
Assicurati solo di leggere questo thread ( cosa c'è di così male nei singleton? ) Prima di usarlo.
Uso di Grand Central Dispatch (GCD)
GCD garantisce che il tuo singleton viene istanziato una volta sola, anche se chiamato da più thread. Inseriscilo in qualsiasi classe per un'istanza singleton denominata shared
.
+ (instancetype)shared {
// Variable that will point to the singleton instance. The `static`
// modifier makes it behave like a global variable: the value assigned
// to it will "survive" the method call.
static id _shared;
static dispatch_once_t _onceToken;
dispatch_once(&_onceToken, ^{
// This block is only executed once, in a thread-safe way.
// Create the instance and assign it to the static variable.
_shared = [self new];
});
return _shared;
}
Creazione della classe Singleton e anche impedendo di avere più istanze utilizzando alloc / init.
Possiamo creare classi Singleton in modo tale che gli sviluppatori siano costretti a utilizzare l'istanza condivisa (oggetto singleton) invece di creare le proprie istanze.
@implementation MySingletonClass
+ (instancetype)sharedInstance
{
static MySingletonClass *_sharedInstance = nil;
static dispatch_once_t oncePredicate;
dispatch_once(&oncePredicate, ^{
_sharedInstance = [[self alloc] initClass];
});
return _sharedInstance;
}
-(instancetype)initClass
{
self = [super init];
if(self)
{
//Do any additional initialization if required
}
return self;
}
- (instancetype)init
{
@throw [NSException exceptionWithName:@"Not designated initializer"
reason:@"Use [MySingletonClass sharedInstance]"
userInfo:nil];
return nil;
}
@end
/*Following line will throw an exception
with the Reason:"Use [MySingletonClass sharedInstance]"
when tried to alloc/init directly instead of using sharedInstance */
MySingletonClass *mySingletonClass = [[MySingletonClass alloc] init];
Creare Singleton e impedirgli di avere più istanze usando alloc / init, new.
//MySingletonClass.h
@interface MYSingletonClass : NSObject
+ (instancetype)sharedInstance;
-(instancetype)init NS_UNAVAILABLE;
-(instancetype)new NS_UNAVAILABLE;
@end
//MySingletonClass.m
@implementation MySingletonClass
+ (instancetype)sharedInstance
{
static MySingletonClass *_sharedInstance = nil;
static dispatch_once_t oncePredicate;
dispatch_once(&oncePredicate, ^{
_sharedInstance = [[self alloc]init];
});
return _sharedInstance;
}
-(instancetype)init
{
self = [super init];
if(self)
{
//Do any additional initialization if required
}
return self;
}
@end
Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow