我听说iOS中对象的懒惰实例很常见,但是我不确定何时应该使用它?有人可以简要解释我何时应该使用延迟实例化以及何时应该在init方法中初始化我的属性?
我对延迟实例化的关注是它需要大量代码(与在init方法中编写所有代码相比),特别是如果你有多个属性要初始化。
答案 0 :(得分:18)
详细说明我的评论。有时这种技术很好,如果你有一个只需要配置一次的对象,并且涉及一些你不想弄乱你的init方法的配置。
- (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方法现在必须知道如何实例化和配置这个视图以及我在那里拍摄的任何其他对象的细节。
答案 1 :(得分:13)
在具有大量内存占用的对象的情况下,这是很好的,因此您可以避免在容器类初始化时初始化所有这些昂贵的对象。 延迟初始化可以在几种情况下保留内存消耗......
但很明显,如果所有对象在容器对象初始化之后或之后需要初始化,则延迟初始化没有任何意义,应该使用标准构造函数初始化。
如果在类中有可选对象,并且在所有类工作流程中都无法初始化,则应使用延迟初始化。
答案 2 :(得分:11)
与任何技术一样,没有一个单一的,适合所有规则可以告诉你何时懒惰地实例化某些东西。我认为好的建议是对实例化成本高昂的事物使用延迟实例化。如果某些东西需要进行大量的磁盘或网络访问,或者需要花费大量的CPU时间来设置,那么最好将这项工作推迟到实际需要(或在后台进行)。特别是对于用户可能使用或不使用的功能,在-init
(或类似)设置中浪费大量时间是没有意义的,这样做有助于使您的应用程序对用户感到迟钝。 / p>
话虽如此,你应该避免过早优化。不要花费大量时间编写复杂的代码来帮助提高性能,直到您以明显的方式完成工作,发现性能问题并分析代码以彻底了解问题。完成后,您可以开始进行更改以改进。
答案 3 :(得分:3)
不仅仅是内存和性能,请查看这个,这是另一个例子:
- (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;
}
您可以使用延迟实例化来执行自定义初始化或特殊配置 是的,这也有益于记忆和表现。