2012-08-15 12 views
6

BNRItemStore è un singleton e sono stato confuso sul motivo per cui è necessario chiamare super allocWithZone: invece del semplice vecchio super alloc. Quindi, sostituisci alloc anziché allocWithZone.Creazione di 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 

risposta

10

[super alloc] chiamerà fino alla allocWithZone:, che abbiate scavalcato a fare qualcosa di diverso. Per ottenere effettivamente l'implementazione della superclasse di allocWithZone: (che è ciò che si desidera lì) anziché la versione sostituita, è necessario inviare allocWithZone: esplicitamente.

La parola chiave super rappresenta lo stesso oggetto di self; dice semplicemente al meccanismo di invio del metodo di iniziare a cercare il metodo corrispondente nella superclasse piuttosto che nella classe corrente.

Così, [super alloc] sarebbe andato fino alla superclasse, e ottenere l'attuazione lì, che sembra qualcosa di simile:

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

Qui, self rappresenta ancora la vostra classe personalizzata, e, quindi, il vostro sovrascritto allocWithZone: è gestito, che invierà il tuo programma in un ciclo infinito.

+0

stumped, questo è sul lato più sottile di un corso introduttivo ObjC, quindi se avete domande sulla mia risposta, sono felice di provare a chiarire. –

+0

Grazie! Ho una domanda. Se ho cancellato il metodo che sovrascrive allocWithZone: sarebbe sicuro chiamare super allocazione invece di super allocWithZone: in sharedStore? – stumped

+0

Sì. Il motivo dell'override di 'allocWithZone:' è di limitare qualsiasi utente di questa classe a creare un'altra istanza. Chiamerebbero 'alloc' (o possibilmente' allocWithZone: 'direttamente, invece di allocare una nuova istanza, invece di restituire quella esistente.Questa è la parte fondamentale per rendere la classe un singleton. –

3

Da documentation di Apple:

Questo metodo esiste per ragioni storiche; le zone di memoria non sono più utilizzate da Objective-C.