Как использовать TDictionary?

Во-первых, не делать. Избегайте этого вида кода. Это имеет тенденцию быть действительно плохим кодом и небезопасный также (см. раздел 6 из Безопасные Инструкции по Кодированию для Языка программирования Java, версии 2.0 ).

, Если необходимо сделать это, предпочтите java.beans отражению. Бобы обертывают отражение, предоставляющее относительно безопасный и стандартный доступ.

6
задан Argalatyr 20 July 2009 в 21:40
поделиться

1 ответ

Вам нужно выполнить загрузку в самом синглтоне, что здесь происходит: вы создаете сингл, вы назначаете lval синглтону, затем создаете новый объект и переназначаете 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;
}

Очевидно, вам нужно каким-то образом передать фактический путь к архивированному объектному файлу.

РЕДАКТИРОВАТЬ НА ОСНОВЕ КОММЕНТАРИИ:

Хорошо,

18
ответ дан 8 December 2019 в 13:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: