gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 08:31:46 24 4
gpt4 key购买 nike

我有一种情况,我想拥有两个相互引用的单例对象。

经理A:

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()
}
}

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

如何解决初始化问题?

我想保持这种模式。这两个管理器都在整个应用程序的各个地方使用,单例模式似乎很合适。然而,如果它们也可以直接相互访问,那将会很有用。

最佳答案

是的,这就是无限递归。

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

这里我将 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 并打破单例范式

关于swift - 两个相互引用的单例阻止初始化结束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40173822/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com