关于 Swift 中的单例模式

about the Singleton pattern in Swift

这是Swift中的一个简单的SingleTon模式,它来自:

https://github.com/hpique/SwiftSingleton

class Test {
    static let shareTest = Test()
    var a = 1
    init() {
        println("testSingeleTon")
    }
}

这是一个测试函数:

func testFunc() {

        var s1 = Test.shareTest
        var s2 = Test.shareTest
        var s3 = Test.shareTest
        var s4 = Test.shareTest

        func printPointer(pointer: UnsafePointer<Test>) {
            println(pointer)
        }

        printPointer(&s1)
        printPointer(&s2)
        printPointer(&s4)
        printPointer(&s3)

        println(s1.a)
        println(s2.a)
        println(s3.a)
        println(s4.a)

        s1.a = 4444

        println("s2.a = \(s2.a)")
        println("s3.a = \(s3.a)")
        println("s4.a = \(s4.a)")

    }

我感到困惑的是结果:

testSingeleTon
0x00007fff54432ad8
0x00007fff54432ad0
0x00007fff54432ac0
0x00007fff54432ac8
1
1
1
1
s2.a = 4444
s3.a = 4444
s4.a = 4444

它看起来像一个 singleTon 模式,因为只是分配 s1.a 的值,而不是 s2.a、s3.a、s4.a 值也发生了变化,但是,如果它是一个真正的 singleTon 模式,为什么 &s1、&s2、&s3、&s4 完全不同??

0x00007fff54432ad8
0x00007fff54432ad0
0x00007fff54432ac0
0x00007fff54432ac8

Swift1.2 之前的单身人士,感谢 Will M. 的澄清。

class ActivityIndicator {

    class var sharedInstance: ActivityIndicator {
        struct Singleton {
            static let instance = ActivityIndicator()
        }
        return Singleton.instance
    }
}

好吧,你不是在打印 s1、s2、s3、s4 的值。你是在使用 & 运算符打印 s1、s2、s3 和 s4 的内存位置....

记住那些内存位置包含相同的实例.....所以你对你的单例模式很好

每个变量 s1、s2、s3、s4 都包含一个指向 Test 对象的指针。打印 &s1 打印该指针的位置,而不是指向的对象的位置。如果要打印对象引用指向的对象的地址

println(unsafeAddressOf(s1))
println(unsafeAddressOf(s2))

source

(我问这个问题是为了更好地解决这个问题)