Вам нужно сделать загрузку в одиночном одиночном режиме, что здесь происходит, вы создаете сингл, вы назначаете lval для singleton, затем создаете новый объект и переназначаете lval на этот новый объект БЕЗ модификации синглтон. Другими словами:
//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];
Что вы хотите сделать, это разобраться с этим в sharedVenue. Есть несколько способов, которые люди делают одиночек, так что я не могу быть уверен, что вы делаете, но давайте предположим, sharedVenue в настоящее время выглядит следующим образом:
static Venue *gSharedVenue = nil;
- (Venue *) sharedVenue {
if (!gSharedVenue) {
gSharedVenue = [[Venue alloc] init];
}
return gSharedVenue;
}
Если предположить, что это случай, если вы хотите изменить его загрузить объект в глобальную поддержку одноэлементный:
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;
}
Очевидно, что вам нужно каким-то образом передать фактический путь к архивному объектному файлу.
EDIT НА ОСНОВЕ КОММЕНТАРИЕВ:
Хорошо, если вы используете Alloc на основе одноплодной вы должны иметь дело с этим в классах инициализации метод:
- (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;
}
Этот ответ имеет для меня немного больше смысла, просто потому, что я могу обвести вокруг него голову. Инициирование другого кажется правильным, но немного сложнее концептуализировать. – rob5408
Отличный ответ ... просто FYI на случай, если кто-то наткнутся на этот вопрос, я считаю, что метод init должен использовать NSKeyedUnarchiver. – Bern11
Спасибо, обновил фрагмент. –