Ленивая загрузка в Objective-C - слишком ленива? - PullRequest
0 голосов
/ 06 июля 2010

У меня есть UIViewController, которому нужно установить несколько меток, когда он получает новое (объектное) значение для одного из своих свойств:

-(void)setCurrentEvent:(Event *)e {
    [currentEvent release];
    currentEvent = [e retain];
    self.dateLabel.text = currentEvent.subtitle;
    self.summaryTextView.text = currentEvent.summary;
    self.avgRatingLabel.text = [NSString stringWithFormat:@"%.1f",currentEvent.avgRating];
    [self setTitle:currentEvent.title];
    [self.view setNeedsDisplay];
}

Я обнаружил, что когда значения установлены дляв первый раз объекты метки и текстового представления еще не инициализированы, поэтому их новые значения не устанавливаются.После первоначального вызова setCurrentEvent все идет хорошо, но я думаю, что я слишком сильно полагаюсь на ленивую загрузку здесь?

Ответы [ 2 ]

1 голос
/ 06 июля 2010

Предполагается, что он пробуждается от пера или загружается из него:

До тех пор, пока не будет вызван метод viewDidLoad вашего контроллера представления, нет гарантии, что какой-либо из ваших IBOutlets установлен.

Я подозреваю, что вы видите, что при первом задании значений ваше представление еще не загружено, а к тому времени, когда значения установлены для второго, они уже есть.

Вам следует отложить обработку до загрузки представления или создать представления самостоятельно, как требуется.

РЕДАКТИРОВАТЬ

В свете вашего комментария, этоКажется, вы загружаете из пера.В этом случае, возможно, я бы сохранил переменную экземпляра (скажем, currentEvent), а затем вызвал бы метод, подобный updateUI, который правильно устанавливает свойства.Затем я бы также поместил updateUI в viewDidLoad, чтобы, когда ярлыки стали доступны, они обновлялись относительно текущего события.

0 голосов
/ 06 июля 2010

Хорошо (хорошо) быть очень ленивым, но вы должны быть осторожны с порядком инициализации, если у вас не все настроено для инициализации по требованию.Обычно я делаю что-то вроде этого

- (UILabel) dateLabel {
  if (!dateLabel) {
    dateLabel = [[UILabel alloc] initWithFrame:FRAME_POSITION];
  }

  return dateLabel;
}

Таким образом, вы точно знаете, что поле инициализируется при обращении к нему, поскольку средство доступа является ленивым инициализатором.Единственный улов - нужно быть осторожным с рекурсивными зависимостями, но я использовал это для большой сложной цепочки инициализации.

...