什么时候在iOS中使用懒惰的实例?

我听说在iOS中对象的惰性实例是相当普遍的,但是我不确定何时使用它。 有人可以给我一个简短的解释,什么时候我应该使用惰性实例化,什么时候我应该只是初始化我的属性在init方法?

我对懒惰实例化的担心是,它需要大量的代码(相比之下,只是把它们写在init方法中),特别是如果你有多个属性来初始化的话。

详细说明我的意见。 有时候,如果你有一个对象只需要configuration一次,并且有一些你不想混淆你的init方法的configuration,那么这个技术是很好的。

- (UIView *)myRoundedView; { if (!_myRoundedView) { _myRoundedView = [[UIView alloc] initWithFrame:<#some frame#>]; _myRoundedView.layer.cornerRadius = 10.f; _myRoundedView.backgroundColor = [UIColor colorWithWhite:0.f alpha:0.6f]; _myRoundedView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight; } return _myRoundedView; } 

这是一个非常人为的例子,但你可以开始看到优点。 方法应该像课堂一样,做一件好事。 这种方法恰好返回我想要的roundedView。 如果我把这段代码放到init方法中,那么init方法现在必须知道如何实例化和configuration这个视图以及我在其中拍摄的任何其他对象的细节。

如果对象具有较大的内存占用空间,则可以避免在容器类初始化时初始化所有这些昂贵的对象。 延迟初始化可以在几种情况下保留内存消耗

然而很明显,如果所有对象在容器对象初始化之后或之后都需要初始化,那么延迟初始化没有任何意义,应该使用标准的构造函数初始化。

如果在类中有可选对象,在所有类工作stream程中都不能初始化,则应使用惰性初始化。

和其他技术一样,没有一个单一的,一刀切的规则来告诉你什么时候懒惰地实例化一些东西。 我认为很好的build议是对实例化的东西使用懒惰的实例化。 如果某些事情需要做大量的磁盘或networking访问,或者需要大量的CPU时间来设置,那么最好是推迟这个工作,直到实际需要(或者在后台执行)为止。 特别是对于用户可能使用或不能使用的function,在-init (或类似的)设置中浪费了大量的时间,这样做可能会导致应用程序对用户感觉迟缓。

这样说,你应该避免过早的优化。 不要花太多的时间编写复杂的代码来帮助提高性能,除非你以明显的方式完成了任务,发现了一个性能问题,并对你的代码进行了剖析,以便彻底理解这个问题。 完成之后,您可以开始进行更改以改进事物。

不仅是内存和性能,请查看下面的例子:

 - (NSArray *)validElements{ if (!_validElements) { _validElements = [[NSArray alloc] initWithObjects: @"mystuff",@"generaldescription",@"title",@"autor", @"version",@"date",@"context",@"operatingsystem",@"kindofdevice", @"deviceversion",@"rule",@"daytime",@"time",@"location",@"deviceheading", @"region",@"language",nil]; } return _validElements; } 

你可以使用懒惰的实例来做一个自定义的初始化或特殊configuration,是的,这也有利于内存和性能。