Swift 单例循环引用的坑
2017-02-07 本文已影响192人
走在路上的小二
1、直接循环引用的看例子
// Test1
class Test1: NSObject {
var test2: Test2?
// MARK: @单例
static let sharedTest1: Test1 = { Test1() }()
override init() {
super.init()
self.test2 = Test2.sharedTest2
}
func printLog() {
print("11111")
}
}
// Test2
class Test2: NSObject {
// MARK: @单例
static let sharedTest2: Test2 = { Test2() }()
override init() {
super.init()
Test1.sharedTest1.printLog()
}
}
// TestVC
class TestVC: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
Test2.sharedTest2
}
}
}
这里会结果不会输出: 11111。 为什么?因为造成死循环了。Test2.sharedTest2 在初始化init的时候调用 Test1.sharedTest1.printLog(),
而 Test1.sharedTest1.printLog() 先执行的是 Test1.sharedTest1 所以在Test1初始化init里面又执行了self.test2 = Test2.sharedTest2 。所以不会执行 pintLog() 会变成死循环。后来 我想把 Test1 中 的 Test2 在属性中赋值,即
var test2: Test2 = Test2.sharedTest2
// 同时注释
// self.test2 = Test2.sharedTest2
发现还是死循环 不会输出 11111,所以肯定在方法执行前就已经执行这行代码
var test2: Test2 = Test2.sharedTest2
最后解决方案
最后 我改为lazy 方法 发现可以用!即:
lazy var test2: Test2 = {
let test = Test2.sharedTest2
return test
}()
// 同时在Test1类中 init 方法里面注释
// self.test2 = Test2.sharedTest2
PS: 终于解决了。的确是不小的坑,还没有提示!