在Objective-C中加载延迟 - 太懒了?

时间:2010-07-06 15:10:27

标签: objective-c lazy-loading

我有一个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 个答案:

答案 0 :(得分:1)

假设它正从一个笔尖中唤醒或从一个笔尖中加载:

在调用视图控制器的viewDidLoad方法之前,无法保证您的任何IBOutlet都已设置。

您所看到的我怀疑是第一次设置值时您的视图尚未加载,并且在第二次设置值时,它们具有。

您应该延迟处理,直到加载视图,或者根据需要自己创建视图。

修改

根据您的评论,您似乎是从笔尖加载。在这种情况下,我可能会保留实例变量(currentEvent说),然后调用类似updateUI的方法来正确设置属性。然后我updateUI放在viewDidLoad中,这样当标签可用时,它们会针对当前事件进行更新。

答案 1 :(得分:0)

很好(好)非常懒,但是如果你没有按需设置init,那么你需要注意初始化顺序。我通常做的就是这样的事情

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

  return dateLabel;
}

通过这种方式,您可以确定在访问字段时初始化该字段,因为访问器是惰性初始化程序。你需要注意递归依赖关系,但我已经将它用于大型复杂的初始化链。