Implementar alloc en un singleton

Me gustaría tener un singleton en mi sistema, pero en lugar de que las personas que llaman accedan a él a través de algún tipo de método 'shanetworkingInstance', me gustaría que fueran conscientes de que están usando un singleton, en otras palabras, Me gustaría que las personas que llaman puedan decir:

MyClass *dontKnowItsASingleton = [[MyClass alloc] init]; 

Para lograr esto, he intentado anular alloc de la siguiente manera:

 // MyClass.m static MyClass *_shanetworkingInstance; + (id)alloc { if (!_shanetworkingInstance) { _shanetworkingInstance = [super alloc]; } return _shanetworkingInstance; } 

Mi pregunta es: ¿esta bien? Parece que funciona, pero nunca he anulado alloc antes. Además, si está bien, ¿podría usar siempre esta técnica, en lugar de aplicar el método de "dispatch_once" que he estado haciendo? …

 + (id)shanetworkingInstance { static SnappyTV *_shanetworkingInstance = nil; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ _shanetworkingInstance = [[self alloc] init]; }); return _shanetworkingInstance; } 

Como se mencionó @ H2CO3, su método de producción de singletons es aceptable, sin embargo, no es seguro. El enfoque más tradicional es envolver su asignación y comparación en un bloque @synchronized para que se networkinguzca el acceso de subprocesss múltiples, sin embargo, +alloc no es la mejor manera de implementar un patrón ya inestable.

Creo que deberías aprovechar el método de initialization:

 + (void) initialize { _shanetworkingInstance= [[self alloc]init]; } + (id)shanetworkingInstance { return _shanetworkingIntsance; } 

En caso de que otros vengan, esta es una solución que creo que integra todos los buenos consejos:

 + (id)alloc { @synchronized(self) { if (!_shanetworkingInstance) { _shanetworkingInstance = [super alloc]; } return _shanetworkingInstance; } } - (id)init { @synchronized(self) { static BOOL init = NO; if (!init) { init = YES; self = [super init]; } } return self; } 

Gracias a @ H2CO3 por el problema de security de hilo, @CodaFi por la prescripción de security de hilo y a @Rob Mayoff por los peligros con init bajo arco. ¡Me ayudaron los mejores y los más shinys hoy!