2012-08-15 14 views
6

BNRItemStore es un singleton, y me confundí sobre por qué super allocWithZone: debe llamarse en lugar de simple super alloc. Y luego anula alloc en lugar de allocWithZone.Creando un singleton con allocWithZone:

#import "BNRItemStore.h" 

@implementation BNRItemStore 

+(BNRItemStore *)sharedStore { 
    static BNRItemStore *sharedStore = nil; 

    if (!sharedStore) 
     sharedStore = [[super allocWithZone: nil] init]; 

    return sharedStore; 
} 

+(id)allocWithZone:(NSZone *)zone { 
    return [self sharedStore]; 
} 

@end 

Respuesta

10

[super alloc] llamarán a través de allocWithZone:, que se ha redefinido para hacer otra cosa. Para obtener realmente la implementación de la superclase de allocWithZone: (que es lo que desea allí) en lugar de la versión anulada, debe enviar allocWithZone: explícitamente.

La palabra clave super representa el mismo objeto que self; simplemente le dice al mecanismo de despacho del método que comience a buscar el método correspondiente en la superclase en lugar de la clase actual.

Por lo tanto, [super alloc] iría hasta la superclase, y obtener la puesta en práctica allí, lo que se ve algo como:

+ (id) alloc 
{ 
    return [self allocWithZone:NULL]; 
} 

Aquí, self sigue representando la clase personalizada, y por lo tanto, su anulado allocWithZone: es correr, que enviará tu programa a un ciclo infinito.

+0

perplejo, este es el lado más sutil de un curso introductorio de ObjC, por lo que si tiene preguntas sobre mi respuesta, me complace intentar aclararlo. –

+0

¡Gracias! Tengo una pregunta. Si eliminé el método que anula allocWithZone: ¿sería seguro llamar a super alloc en lugar de a super allocWithZone: en sharedStore? – stumped

+0

Sí. La razón para anular 'allocWithZone:' es restringir a los usuarios de esta clase la creación de otra instancia. Llamarían 'alloc' (o posiblemente' allocWithZone: 'directamente; en lugar de asignar una nueva instancia, en su lugar devolverían la existente. Esta es la parte clave para hacer que la clase sea singleton. –

3

De documentation de Apple:

Este método existe por razones históricas; las zonas de memoria ya no son utilizadas por Objective-C.