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.