美文网首页iOS Developer
Swift 单例循环引用的坑

Swift 单例循环引用的坑

作者: 走在路上的小二 | 来源:发表于2017-02-07 17:56 被阅读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: 终于解决了。的确是不小的坑,还没有提示!

    相关文章

      网友评论

        本文标题:Swift 单例循环引用的坑

        本文链接:https://www.haomeiwen.com/subject/ihdmittx.html