什么是全局变量和共享实例,在Swift中它们各自的使用领域有什么区别?能否根据Swift概述它们的概念。
全局变量是在文件的顶层声明的变量。因此,如果我们有一个名为Bar
的类,您可以像这样在全局变量中存储对 Bar
实例的引用:
var bar = Bar()
然后您就可以从任何地方访问该实例,像这样:
bar
bar.foo()
一个共享实例,或单例,看起来像这样:
class Bar {
static var shared = Bar()
private init() {}
func foo() {}
}
然后,您可以从模块中的任何位置访问共享实例,像这样:
Bar.shared
Bar.shared.foo()
不过,除了全局变量普遍不被推荐之外,Singleton
模式与其最重要的区别之一是它限制了你创建其他Bar
实例的能力。在第一个示例中,你可以创建更多的全局变量:
var bar2 = Bar()
var bar3 = Bar()
然而,如果使用单例(共享实例),则初始化器是私有的,因此尝试这样做会出现问题...
var baaar = Bar()
...结果是这样的:
'Bar'初始化器由于私有保护级别而不可访问
这是一件好事,因为单例的目的在于存在一个 唯一的 共享实例。现在您唯一能够访问Bar
的实例就是通过Bar.shared
。请记住在类中添加 private init()
,并且不添加任何其他初始化器,否则将不再强制执行。
如果您想了解更多信息,则可以阅读KrakenDev的一篇很棒的文章here。
Swift
中,您可以将init
声明为fileprivate
并将全局变量的声明放入同一文件中,这样描述的差异就消失了。您有一个全局变量
,不能创建该类型的任何其他实例,因为init
是不可访问的。 - user28434'mstep单例模式(共享实例)
确保只创建一个单例对象的实例,并提供全局访问该对象的共享实例,即使在整个应用程序中也可以共享。
使用dispatch_once函数执行一次块,仅在应用程序的生命周期内执行一次
。
全局变量
苹果文档称全局变量是定义在任何函数、方法、闭包或类型上下文之外
的变量。