懒惰的实例化缺点iOS

时间:2013-04-23 10:25:23

标签: ios objective-c lazy-loading

所以似乎懒惰的实例化被广泛使用,并且每个人都知道惰性实例化的优点。

这导致了一个问题:我们应该懒惰地实例化每个对象吗?

我非常怀疑。

所以问题是,懒惰实例化的缺点是什么?

取自(Apple Sample LocateMe)的样本:

- (NSDateFormatter *)dateFormatter {
    if (dateFormatter == nil) {
        dateFormatter = [[NSDateFormatter alloc] init];
        [dateFormatter setDateStyle:NSDateFormatterMediumStyle];
        [dateFormatter setTimeStyle:NSDateFormatterLongStyle];
    }
    return dateFormatter;
}

这将为我们提供仅在需要时初始化此对象的优势。

顺便说一句,上面的样本取自Apple,似乎他们只是懒惰的实例化" readonly"对象。

1 个答案:

答案 0 :(得分:2)

好的,我想我会以答案的形式改写我的回复(广告你现在收到的评论太多了)......

在您给出的示例中,多次使用同一个对象实例是安全的,因为其内部状态不受影响。也就是说,它提供服务并且不会在呼叫之间保持状态。

作为一般规则,懒惰实例化仅与单身人士或通过工厂提供的实例相关。例如,在您的示例中,生活在“服务”或应用程序期间的实例 - 例如资源处理。通常,您通常只想在需要时创建新的对象实例。

延迟初始化的优点/缺点是:

  • 您只需要初始化一个对象一次,单个实例就足以满足所有服务调用。电话之间不会举行州。这样做的好处是加载对象可能非常耗时,因此可以避免启动成本,或者在单例上下文中避免实例化多个昂贵的对象。这也适用于内存占用 - 一个实例,而不是很多。
  • 但是如果你懒得进入一个物体,那么在运行时会有成本,因为你实际上已经推迟了它的构造。因此,在运行时,当用户等待时,您将创建一个昂贵的对象。不理想,所以你应该避免这种情况 - 如果它再次成为一个长期服务对象。
  • 在你给出的例子中,还有一个对记忆负责的问题。客户端代码显然负责释放此实例。如果它是一个长期服务的对象,他们在哪里做?好吧,您可能需要观看NSApp的applicationWillTerminate委托。
  • 如果实例维护将在实例上的方法调用之间设置的状态,则此模式不起作用。调用之间的实例状态可能不一致(可能已更改)。

另请注意,这是一个实例方法,如果它是null,则设置实例var的值...这意味着,在这种情况下,每个封闭类实例仍然有一个实例(定义此方法的类) )。在此上下文中,您的封闭实例负责清理。真的,我认为这是为了清晰的代码,而不是内存管理。或者封闭类可能是长寿命的,它可以节省重新创建格式化程序(重建时可能比重置更昂贵)。

如果有任何其他想法,

将进行编辑。希望它有所帮助。