È necessario eseguire il caricamento nel singleton stesso cosa sta succedendo qui è creare il singolo, assegnare un lval al singleton, quindi creare un nuovo oggetto e riassegnare il lval a quel nuovo oggetto SENZA modificare il valore singleton. In altre parole:
//Set venue to point to singleton
Venue *venue = [Venue sharedVenue];
//Set venue2 to point to singleton
Venue *venue2 = [Venue sharedVenue];
NSData *data = [[NSMutableData alloc] initWithContentsOfFile:[self dataFilePath]];
NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:data];
//Set venue to unarchived object (does not change the singleton or venue2)
venue = [unarchiver decodeObjectForKey:@"Venue"];
[unarchiver finishDecoding];
Ciò che si vuole fare è gestirlo in SharedVenue. Ci sono un paio di modi le persone fanno single, quindi non posso essere sicuro di quello che state facendo, ma lascia supporre sharedVenue attualmente simile a questa:
static Venue *gSharedVenue = nil;
- (Venue *) sharedVenue {
if (!gSharedVenue) {
gSharedVenue = [[Venue alloc] init];
}
return gSharedVenue;
}
Partendo dal presupposto che è il caso che si desidera cambiarlo in caricare l'oggetto nel supporto globale Singleton:
static Venue *gSharedVenue = nil;
- (Venue *) sharedVenue {
if (!gSharedVenue) {
NSData *data = [[NSMutableData alloc] initWithContentsOfFile:[self dataFilePath]];
NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:data];
[data release];
gSharedVenue = [unarchiver decodeObjectForKey:@"Venue"];
[unarchiver finishDecoding];
[unarchiver release];
}
if (!gSharedVenue) {
gSharedVenue = [[Venue alloc] init];
}
return gSharedVenue;
}
Ovviamente è necessario trasmettere in qualche modo il percorso effettivo al file oggetto archiviato.
modifica in base ai COMMENTO:
Va bene, se si utilizza l'alloc Singleton base è necessario per affrontare questo nelle classi metodo init:
- (id) init {
self = [super init];
if (self) {
NSData *data = [[NSMutableData alloc] initWithContentsOfFile:[self dataFilePath]];
NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:data];
[data release];
Venue *storedVenue = [unarchiver decodeObjectForKey:@"Venue"];
[unarchiver finishDecoding];
[unarchiver release];
if (storeVenue) {
[self release];
self = [storedVenue retain];
}
}
return self;
}
fonte
2009-07-18 23:30:10
Questa risposta ha un po 'più senso per me, solo perché riesco a capirlo. L'init di altri sembra corretto ma un po 'più difficile da concettualizzare. – rob5408
Ottima risposta ... solo una FYI nel caso in cui qualcuno si imbattesse in questa domanda, credo che il metodo init dovrebbe usare un NSKeyedUnarchiver. – Bern11
Grazie, aggiornato lo snippet. –