如何解决self.init使便捷的init{}无限运行
我有一个要尝试初始化的类,但是,正如标题所示,convenience init
方法可以无限运行。为什么会这样?
class Peripheral: CBPeripheralManager,CBPeripheralManagerDelegate
{
var peripheralManager : CBPeripheralManager!
convenience init(delegate: CBPeripheralManagerDelegate?,queue: DispatchQueue?)
{
print("howdy")
self.init()
peripheralManager = CBPeripheralManager(delegate: self,queue: nil,options: [CBPeripheralManagerOptionShowPowerAlertKey: true])
peripheralManager.add(myCBService)
}
func peripheralManagerDidUpdateState(_ peripheral: CBPeripheralManager)
{
}
}
let myPeripheral = Peripheral.init()
我运行程序大约十秒钟,“ howdy”打印了42266次。我将打印语句置于self.init()以下,而“ howdy”根本没有打印。我在做什么错了?
解决方法
您发现Objective-C和Swift实现之间存在一些冲突。
CBPeripheralManager
有3种init
方法,基本上是这样的:
convenience init() {
self.init(delegate: nil,queue: nil)
}
convenience init(delegate: CBPeripheralManagerDelegate?,queue: DispatchQueue?) {
self.init(delegate: delegate,queue: queue,options: nil)
}
// designated
init(delegate: CBPeripheralManagerDelegate?,queue: DispatchQueue?,options: [String : Any]?)
// the actual implementation
}
一旦您声明了一个新的convenience
初始化程序,就会删除这两个便捷初始化程序,并且仅存在您定义的一个。通常,您将根本无法呼叫Peripheral.init()
。但是,问题在于,Objective-C类总是具有一个init
方法,而没有参数。
这意味着init()
委派给新的便捷初始化程序,而初始化程序又委托给init()
,最终陷入无限循环。
解决方案,请勿致电init()
。调用指定的初始化程序:
class Peripheral: CBPeripheralManager,CBPeripheralManagerDelegate {
var peripheralManager : CBPeripheralManager!
convenience init(delegate: CBPeripheralManagerDelegate?,queue: DispatchQueue?) {
print("howdy")
self.init(delegate: delegate,options: nil)
peripheralManager = CBPeripheralManager(delegate: self,queue: nil,options: [CBPeripheralManagerOptionShowPowerAlertKey: true])
peripheralManager.add(myCBService)
}
}
但是,似乎有一个更深层次的问题。为什么要从CBPeripheralManager
内部创建新的CBPeripheralManager
?
实际上不是您想要的吗?:
class Peripheral: NSObject,CBPeripheralManagerDelegate {
var peripheralManager: CBPeripheralManager!
override init() {
print("howdy")
super.init()
peripheralManager = CBPeripheralManager(delegate: self,options: [CBPeripheralManagerOptionShowPowerAlertKey: true])
peripheralManager.add(myCBService)
}
func peripheralManagerDidUpdateState(_ peripheral: CBPeripheralManager) {
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。