Encontré información en la red para crear una clase singleton usando GCD. Eso es genial porque es seguro para subprocesos con muy poca sobrecarga. Lamentablemente no pude encontrar soluciones completas, sino solo fragmentos del método sharedInstance. Así que hice mi propia clase utilizando el método de ensayo y error - y et voila - la siguiente salió:¿Corregir el patrón Singleton Objective C (iOS)?
@implementation MySingleton
// MARK: -
// MARK: Singleton Pattern using GCD
+ (id)allocWithZone:(NSZone *)zone { return [[self sharedInstance] retain]; }
- (id)copyWithZone:(NSZone *)zone { return self; }
- (id)autorelease { return self; }
- (oneway void)release { /* Singletons can't be released */ }
- (void)dealloc { [super dealloc]; /* should never be called */ }
- (id)retain { return self; }
- (NSUInteger)retainCount { return NSUIntegerMax; /* That's soooo non-zero */ }
+ (MySingleton *)sharedInstance
{
static MySingleton * instance = nil;
static dispatch_once_t predicate;
dispatch_once(&predicate, ^{
// --- call to super avoids a deadlock with the above allocWithZone
instance = [[super allocWithZone:nil] init];
});
return instance;
}
// MARK: -
// MARK: Initialization
- (id)init
{
self = [super init];
if (self)
{
// Initialization code here.
}
return self;
}
@end
No dude en comentar y dime si he perdiendo algo o hacer algo completamente equivocado;)
Saludos Stefan
estaría tentado a agregue un '- (void) dealloc' que arroje una excepción, de esa manera usted debería ser capaz de rastrear al actor ofensor si alguien está obteniendo una instancia de singleton y luego liberándola. Además de ser un abuso del patrón, eso te dejará con un puntero colgando. – Tommy
meta pregunta: ¿debería ser esto en [http://codereview.stackexchange.com/]? – Joren
apple recomienda encarecidamente no crear singletons anulando retención/liberación! esto interrumpirá las aplicaciones que cambian a ARC –