iOS Developer

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: 终于解决了。的确是不小的坑,还没有提示!

上一篇下一篇

猜你喜欢

热点阅读