我有一种情况,我希望有两个单独的对象保持彼此的引用。
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不再显示,所以我认为初始化过程是无止境的。
如何解决初始化?
我想留下这种模式。两个经理都在各个地方的应用程序中使用,单身模式似乎合适。然而,如果他们也可以直接互相访问,那将是有用的。
答案 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
,您就可以从任何地方检索唯一允许的类实例。
因此,您可以轻松删除managerA
和managerB
属性。
NSObject
这些东西,因为你真的不需要那些吗?final
,否则有人可以将它们子类化,添加一个init并打破单例范式