CLKComplicationServer初始化一个已经初始化的单例class CLKComplicationDataSource,虽然init()是私有的
CLKComplicationServer initializes an already initialized singleton class CLKComplicationDataSource, although init() is private
为了更新手表上的复杂功能,我使用了单例class ComplicationController
(下面已省略无关代码):
final class ComplicationController: NSObject, CLKComplicationDataSource {
static let shared = ComplicationController() // Instantiate the singleton
private override init() {
super.init()
print("====self: \(self): init")
} // Others can't init the singleton
}
单例由扩展委托在手表上创建:
class ExtensionDelegate: NSObject, WKExtensionDelegate {
override init() {
super.init()
_ = ComplicationController.shared
}
}
当我在上面的打印语句处使用断点启动 watch 扩展时,执行中断并且堆栈跟踪为:
然后当我一步执行打印语句时,调试器显示:
====self: <Watch_Extension.ComplicationController: 0x7bf35f20>: init
当我继续时,执行在同一个断点处再次中断,堆栈跟踪为:
又一步之后,调试器显示:
====self: <Watch_Extension.ComplicationController: 0x7d3211d0>: init
显然,CLKComplicationServer
已经创建了另一个单例实例。
我的问题是:我是不是出了什么问题或者这是一个错误?如果它是一个错误,是否有解决方法?
PS: 不初始化ExtensionDelegate
中的ComplicationController
无济于事。在这种情况下,只要在代码中的任何地方使用 ComplicationController.shared
,就会创建第二个实例。
我找到了解决方法:
不要在应用程序中实例化单例,即不要在任何地方使用 ComplicationController.shared
。
如果您必须调用 ComplicationController.shared
中的函数,请发送通知,例如到默认通知中心。
ComplicationController
单例必须注册此类通知,并且当它收到一个通知时,它必须执行所需的功能。
这对我有用。
为了更新手表上的复杂功能,我使用了单例class ComplicationController
(下面已省略无关代码):
final class ComplicationController: NSObject, CLKComplicationDataSource {
static let shared = ComplicationController() // Instantiate the singleton
private override init() {
super.init()
print("====self: \(self): init")
} // Others can't init the singleton
}
单例由扩展委托在手表上创建:
class ExtensionDelegate: NSObject, WKExtensionDelegate {
override init() {
super.init()
_ = ComplicationController.shared
}
}
当我在上面的打印语句处使用断点启动 watch 扩展时,执行中断并且堆栈跟踪为:
然后当我一步执行打印语句时,调试器显示:
====self: <Watch_Extension.ComplicationController: 0x7bf35f20>: init
当我继续时,执行在同一个断点处再次中断,堆栈跟踪为:
又一步之后,调试器显示:
====self: <Watch_Extension.ComplicationController: 0x7d3211d0>: init
显然,CLKComplicationServer
已经创建了另一个单例实例。
我的问题是:我是不是出了什么问题或者这是一个错误?如果它是一个错误,是否有解决方法?
PS: 不初始化ExtensionDelegate
中的ComplicationController
无济于事。在这种情况下,只要在代码中的任何地方使用 ComplicationController.shared
,就会创建第二个实例。
我找到了解决方法:
不要在应用程序中实例化单例,即不要在任何地方使用 ComplicationController.shared
。
如果您必须调用 ComplicationController.shared
中的函数,请发送通知,例如到默认通知中心。
ComplicationController
单例必须注册此类通知,并且当它收到一个通知时,它必须执行所需的功能。
这对我有用。