我应该为我的视图控制器使用单例吗?

Posted

技术标签:

【中文标题】我应该为我的视图控制器使用单例吗?【英文标题】:Should I use singelton for my view controller? 【发布时间】:2012-07-19 12:43:19 【问题描述】:

我有一个要从我的应用程序的不同屏幕显示的视图。我不想从每个屏幕分配和初始化视图。我认为这可以使用两种方法来完成:

1) 在 App Delegate 中初始化视图并从所有屏幕访问相同的视图。 (注意:我不想在窗口上添加视图,因为我的应用只支持横向,这将导致大量意大利面条代码来管理视图方向。)

2) 改为单例视图

现在,关于单例模式总体上是好是坏的争论很多。另外,我知道将单例用于视图控制器被视为 bad idea 。

有没有更好的方法来实现这一点??

【问题讨论】:

【参考方案1】:

使用单例并不是一个坏主意,它实际上是一种可靠的模式,允许在整个应用程序生命周期中存储快速访问的数据。 NSUserDefaultsNSFileManagerNSNotificationCenter 和许多其他 Apple 默认类使用单例模式。如果您的视图占用了太多内存(例如,它上面有很多繁重的图形资源),那么您应该有一个类,该类在您每次调用它时创建该视图并将其加载到内存中一段时间如果你的视图是轻量级的,你应该静态创建它,并使用单例类在整个 App 的生命周期中保持它的生命周期。

【讨论】:

【参考方案2】:

使用单例或使用应用程序委托的属性是完成相同任务的等效方法。也可以使用传递给所有“相关方”的通用结构。

你选择哪一个取决于你——“理想”的选择取决于具体情况。

但是,要小心以数十或数百个单例结束 - 这通常表明您的设计没有经过深思熟虑。

【讨论】:

【参考方案3】:

单例是现代的全局变量,所以除非绝对必要,否则我会尽量避免使用它们。在移植到 Carbon 时,使用 Apple 的低内存全局变量会导致各种问题。

如果您正在维护库,请注意每个库都会有一个单例实例,因此您需要小心谁在访问它们。我在 Loki 单例实现 (C++) 中遇到了这个问题,尽管 Objective-C 单例也会有同样的问题。

【讨论】:

【参考方案4】:

我有一个要从我的应用程序的不同屏幕显示的视图。一世 不想从每个屏幕分配和初始化视图。

为什么您不想根据需要创建视图?视图占用大量内存:

非视网膜 iPhone 上的半屏视图 (240*320) 仅用于像素就需要 300KB。

Retina 显示器上的相同视图需要 1.2MB

仅出于这个原因,仅在您真正需要时分配您的共同视图似乎是一个非常好的主意。当视图不显示时,挂在视图上没有任何好处。

【讨论】:

以上是关于我应该为我的视图控制器使用单例吗?的主要内容,如果未能解决你的问题,请参考以下文章

我正在用 Swift 编写 iOS 应用程序。我应该使用单例吗?

注入 Guice 的 DAO 应该是单例吗?

我应该使用单例吗?

XCode:无缝保持位置更新

自己写的程序有必要用单例吗

我应该在 ARC 中使用 nil