两个相互引用的单例阻止初始化结束

时间:2016-10-21 10:07:25

标签: swift singleton

我有一种情况,我希望有两个单独的对象保持彼此的引用。

ManagerA:

import Foundation

class ManagerA: NSObject {

    static let sharedInstance = ManagerA()

    let managerB = ManagerB.sharedInstance

    private override init() {
        super.init()
    }
}

ManagerB (在此示例中与ManagerA对称):

import Foundation

class ManagerB: NSObject {

    static let sharedInstance = ManagerB()

    let managerA = ManagerA.sharedInstance

    private override init() {
        super.init()
    }
}

正在AppDelegate中创建管理员A. 不幸的是,这导致ViewController不再显示,所以我认为初始化过程是无止境的。

如何解决初始化?

我想留下这种模式。两个经理都在各个地方的应用程序中使用,单身模式似乎合适。然而,如果他们也可以直接互相访问,那将是有用的。

1 个答案:

答案 0 :(得分:4)

是的,这是无限递归。

你可以通过多种方式解决这个问题。

这里我将2个属性中的一个作为计算属性,看看

final class ManagerA {
    static let sharedInstance = ManagerA()
    var managerB = { return ManagerB.sharedInstance }
    private init() { }
}

final class ManagerB {
    static let sharedInstance = ManagerB()
    let managerA = ManagerA.sharedInstance
    private init() { }
}

更多

但是你真的需要一个属性来引用单身人士吗?单例的优点在于,只需编写ClassName.sharedInstance,您就可以从任何地方检索唯一允许的类实例。

因此,您可以轻松删除managerAmanagerB属性。

我做了一些改变

  • 我删除了NSObject这些东西,因为你真的不需要那些吗?
  • 我创建了你的类final,否则有人可以将它们子类化,添加一个init并打破单例范式