Swift Objective-C 中的单例访问触发 EXC_BAD_INSTRUCTION (EXC_I386_INVOP)
Swift Singleton access in Objective-C triggers EXC_BAD_INSTRUCTION (EXC_I386_INVOP)
我在 Swift 4.2 中创建了一个单例对象,并试图在 Objective-C class 中访问它(调用几个方法)。但是,在 Objective-C 中调用实例时,应用程序崩溃并显示以下内容:
EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0)
我的 Swift 单例定义并没有什么异常,仅在其他 Swift classes 调用时它工作正常。这是它的样子:
@objc public static let sharedManager = SessionManager()
项目中的语言互操作性似乎也不是问题:从 Objective-C 访问非单例文件不会导致崩溃。我也不确定这个 Objective-C 代码是否太疯狂以至于它应该导致它:
// Have attempted both flavors here, the crash is coming from the call to "sharedManager", which the runtime thinks is nil
SessionManager *manager = [SessionManager sharedManager];
[manager setSession:nil];
关于如何解决这个问题有什么想法吗?我错过了什么?为什么单例实例永远为零?
编辑:我尝试将 Swift 单例的实现扩展到此,但它仍然不起作用:
@objc final class SessionManager: NSObject {
@objc public static let _sharedManager = SessionManager()
private override init() {
super.init()
}
@objc public class func sharedManager() -> SessionManager {
return SessionManager._sharedManager
}
}
第一次访问Objective-C中的Singleton时,必须初始化存储在class中的每个变量。
我发现正在发生的事情(以及使这如此令人沮丧的原因)是正在初始化的对象之一在其自己的初始化程序中调用了单例对象——从而形成了运行时无法执行的无限循环。 t退出。
如果您来自 Google... 在创建具有非可选变量的单例对象时,请确保变量的初始值设定项不引用单例从中初始化它们。基本上,避免无意中创建无限循环。
UPDATE: A bug report radar has been filed with the Swift team.
我在 Swift 4.2 中创建了一个单例对象,并试图在 Objective-C class 中访问它(调用几个方法)。但是,在 Objective-C 中调用实例时,应用程序崩溃并显示以下内容:
EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0)
我的 Swift 单例定义并没有什么异常,仅在其他 Swift classes 调用时它工作正常。这是它的样子:
@objc public static let sharedManager = SessionManager()
项目中的语言互操作性似乎也不是问题:从 Objective-C 访问非单例文件不会导致崩溃。我也不确定这个 Objective-C 代码是否太疯狂以至于它应该导致它:
// Have attempted both flavors here, the crash is coming from the call to "sharedManager", which the runtime thinks is nil
SessionManager *manager = [SessionManager sharedManager];
[manager setSession:nil];
关于如何解决这个问题有什么想法吗?我错过了什么?为什么单例实例永远为零?
编辑:我尝试将 Swift 单例的实现扩展到此,但它仍然不起作用:
@objc final class SessionManager: NSObject {
@objc public static let _sharedManager = SessionManager()
private override init() {
super.init()
}
@objc public class func sharedManager() -> SessionManager {
return SessionManager._sharedManager
}
}
第一次访问Objective-C中的Singleton时,必须初始化存储在class中的每个变量。
我发现正在发生的事情(以及使这如此令人沮丧的原因)是正在初始化的对象之一在其自己的初始化程序中调用了单例对象——从而形成了运行时无法执行的无限循环。 t退出。
如果您来自 Google... 在创建具有非可选变量的单例对象时,请确保变量的初始值设定项不引用单例从中初始化它们。基本上,避免无意中创建无限循环。
UPDATE: A bug report radar has been filed with the Swift team.