Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective-C中的延迟加载——太懒了?_Objective C_Lazy Loading - Fatal编程技术网

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

Objective-C中的延迟加载——太懒了?,objective-c,lazy-loading,Objective C,Lazy Loading,我有一个UIViewController,当它接收到它的一个属性的新(对象)值时,需要设置一些标签: -(void)setCurrentEvent:(Event *)e { [currentEvent release]; currentEvent = [e retain]; self.dateLabel.text = currentEvent.subtitle; self.summaryTextView.text = currentEvent.summary;

我有一个
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
之后,一切都进行得很顺利,但我认为我在这里对延迟加载的依赖有点太多了?

非常延迟是好的,但是如果没有将所有内容都设置为init on demand,则需要小心初始化顺序。我通常是这样做的

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

  return dateLabel;
}

这样,当您访问字段时,您就可以肯定地知道该字段已初始化,因为访问器是惰性初始值设定项。对于递归依赖项,您需要注意的一个问题是,我已经将其用于大型复杂的初始化链。

假设它是从nib唤醒或从nib加载的:

在调用视图控制器的
viewDidLoad
方法之前,不能保证设置了任何iboutlet

我怀疑您看到的是,在第一次设置值时,您的视图尚未加载,而在为第二次设置值时,视图已经加载

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

编辑


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

问题是,我从nib加载视图,因此需要计算所有帧,特别是对于访问器方法,这似乎不太优雅,更不用说很多工作了。这里的关键是等待viewDidLoad。一旦你帮助我意识到你不能依赖于在viewDidLoad之前设置插座,我就按照你建议的方式计算出来了。谢谢