Musisz wykonać ładowanie w samym singletonie, co się tutaj dzieje, to tworzysz singiel, przypisujesz lval do singletonu, następnie tworzysz nowy obiekt i ponownie przypisujesz lval do tego nowego obiektu BEZ modyfikowania singel. Innymi słowy:
//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];
To, co chcesz zrobić, to uporać się z opcją sharedVenue. Istnieje kilka sposobów zrobienia pojedynczych osób, więc nie mogę być pewien, co robisz, ale pozwala zakładać sharedVenue obecnie wygląda mniej więcej tak:
static Venue *gSharedVenue = nil;
- (Venue *) sharedVenue {
if (!gSharedVenue) {
gSharedVenue = [[Venue alloc] init];
}
return gSharedVenue;
}
Zakładając, że ma miejsce w przypadku chcesz go zmienić załadować obiekt w globalnej podkładzie 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;
}
Oczywiście trzeba jakoś przekazać rzeczywistą ścieżkę do archiwum pliku wynikowego.
EDIT oparte na komentarz:
Dobrze, jeśli używasz singleton oparte na Alloc trzeba sobie z tym poradzić w klasach metody 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;
}
Ta odpowiedź ma dla mnie trochę więcej sensu, tylko dlatego, że mogę ją owinąć. Inicjatywa tego drugiego wydaje się poprawna, ale nieco trudniejsza do konceptualizacji. – rob5408
Świetna odpowiedź ... po prostu FYI na wypadek, gdyby ktoś natknął się na to pytanie, uważam, że metoda init powinna używać NSKeyedUnarchiver. – Bern11
Dzięki, zaktualizowałeś fragment. –