Tiene que cargar solo en el singleton. Lo que está pasando aquí es que cree el single, asigne un lval al singleton, luego cree un nuevo objeto y reasigne el lval a ese nuevo objeto SIN modificar el semifallo. En otras palabras:
//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];
Lo que quieres hacer es solucionar esto en sharedVenue. Hay un par de maneras que la gente hace únicos, por lo que no pueden estar seguros de lo que está haciendo, pero supongamos sharedVenue actualmente se ve algo como esto:
static Venue *gSharedVenue = nil;
- (Venue *) sharedVenue {
if (!gSharedVenue) {
gSharedVenue = [[Venue alloc] init];
}
return gSharedVenue;
}
Si se asume que es el caso de que quiera cambiarlo a cargar el objeto en el respaldo mundial 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;
}
Obviamente se necesita para transmitir de alguna manera la trayectoria real de archivo de objetos archivados.
la edición en función a un comentario:
bien, si está utilizando el singleton basado alloc que necesita para hacer frente a esto en las clases método 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;
}
Esta respuesta tiene más sentido para mí, solo porque puedo entenderlo. El init del otro parece correcto pero un poco más difícil de conceptualizar. – rob5408
Gran respuesta ... solo un FYI en caso de que alguien se tropiece con esta pregunta, creo que el método init debería usar un NSKeyedUnarchiver. – Bern11
Gracias, actualicé el fragmento. –