1押桃、直接循環(huán)引用的看例子
// 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虐秦。 為什么晓殊?因為造成死循環(huán)了府寒。Test2.sharedTest2 在初始化init的時候調(diào)用 Test1.sharedTest1.printLog()魁衙,
而 Test1.sharedTest1.printLog() 先執(zhí)行的是 Test1.sharedTest1 所以在Test1初始化init里面又執(zhí)行了self.test2 = Test2.sharedTest2 。所以不會執(zhí)行 pintLog() 會變成死循環(huán)株搔。后來 我想把 Test1 中 的 Test2 在屬性中賦值剖淀,即
var test2: Test2 = Test2.sharedTest2
// 同時注釋
// self.test2 = Test2.sharedTest2
發(fā)現(xiàn)還是死循環(huán) 不會輸出 11111,所以肯定在方法執(zhí)行前就已經(jīng)執(zhí)行這行代碼
var test2: Test2 = Test2.sharedTest2
最后解決方案
最后 我改為lazy 方法 發(fā)現(xiàn)可以用纤房!即:
lazy var test2: Test2 = {
let test = Test2.sharedTest2
return test
}()
// 同時在Test1類中 init 方法里面注釋
// self.test2 = Test2.sharedTest2
PS: 終于解決了纵隔。的確是不小的坑,還沒有提示炮姨!