C'è un paio di cose da considerare qui. Innanzitutto, la guida sui concetti di base di Cocoa è un po 'obsoleta. Non tiene conto di alcune delle tecnologie attuali sviluppate da Apple, come Grand Central Dispatch e Automated Reference Counting. Il [retain] nel tuo metodo allocWithZone non si compilerebbe correttamente in un progetto abilitato ARC (dato che sei nuovo in Obj-C, sto facendo un presupposto anche tu sei nuovo per iOS/iPhone, e così tu dovrebbe leggere su quelle due tecnologie).
C'è una buona discussione di diversi modelli di progettazione Singleton oltre in questa discussione: What should my Objective-C singleton look like?
Tuttavia questo è un thread vecchio, e come tale non tiene conto automatizzata conteggio dei riferimenti (ho utilizzato Louis La risposta di Gerbang per anni e non funziona più nei progetti abilitati ARC.
per Arc-enabled progetti/file (sì ARC può essere attivata solo per i singoli file) - ci siamo spostati ad un Singleton che utilizza GCD e funziona abbastanza bene:
static YourClassName * volatile sharedInstance = nil;
+ (YourClassName *)sharedInstance
{
static dispatch_once_t sharedInstanceToken;
dispatch_once(&sharedInstanceToken, ^{
sharedInstance = [[YourClassName alloc] init];
});
return sharedInstance;
}
cosa sta succedendo qui? Bene, se dai un'occhiata allo GCD docs, vedrai che dispatch_once viene eseguito una sola volta durante l'intera vita di un'applicazione per un oggetto particolare. Come dicono i documenti, questo lo rende molto utile per creare singleton in un modo sicuro per i thread.
Inoltre, dichiariamo volatile il metodo sharedInstance, il che significa che il compilatore/runtime non deve mai provare a memorizzare una chiamata al metodo e deve sempre eseguire il codice all'interno. Questo assicura che chiamiamo sempre in GCD e che recuperiamo sempre l'oggetto che dovremmo.
Sto sorvolando un mucchio da quando sei nuovo a Obj-C, ma sicuramente dai un'occhiata a GCD, ARC, e poi una volta che hai una solida base in Obj-C, cercando nella cache di IMP , che è ciò che volatile impedisce di accadere.
Puoi dare un'occhiata a [il mio post precedente sull'implementazione del modello singleton] (http://stackoverflow.com/questions/6912703/objective-c-static-field-and-implementing-singleton-pattern/6913036#6913036). Se hai inserito molti commenti nel codice di implementazione. Spero che questo aiuti –
Perché stai allocando super? Non vuoi invece un'istanza di sé? –
Questo è un documento incredibilmente vecchio. –