关于 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))
等
(我问这个问题是为了更好地解决这个问题)
这是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))
等