【问题标题】:Swift Singleton access in Objective-C triggers EXC_BAD_INSTRUCTION (EXC_I386_INVOP)Objective-C 中的 Swift 单例访问触发 EXC_BAD_INSTRUCTION (EXC_I386_INVOP)
【发布时间】:2019-01-26 03:44:51
【问题描述】:

我在 Swift 4.2 中创建了一个单例对象,并试图在一个 Objective-C 类中访问它(调用几个方法)。但是,在 Objective-C 中调用实例时,应用程序崩溃并显示以下内容:

EXC_BAD_INSTRUCTION(代码=EXC_I386_INVOP,子代码=0x0)

我的 Swift 单例定义并没有什么不寻常的地方,而且在仅从其他 Swift 类调用时也能正常工作。这是它的样子:

@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 Singleton 的实现扩展到此,但它仍然无法正常工作:

@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 中调用了哪些方法?您可能正在那里做一些快速的事情,这些事情不一定能很好地转化为 objc 运行时内存。
  • 向我们展示完整的单例代码。
  • @GeneCode 从 Swift 4 开始,根据 Apple 文档,这是创建单例的完整且推荐的方法。一条线。似乎应该有更多,因为显然这是一个问题。
  • @AntwanvanHoudt 我已经编辑了这个问题,并在 ObjC 方面提供了更多细节。不幸的是,当从 ObjC 访问“sharedManager”时,它看起来像 nil。
  • 嗯.. 没有看到单例的类部分??见这里:stackoverflow.com/a/26743597/501439

标签: objective-c swift singleton


【解决方案1】:

在 Objective-C 中第一次访问 Singleton 时,必须初始化类中存储的每个变量。

我发现正在发生的事情(以及使这如此令人沮丧的原因)是正在初始化的对象之一在其自己的初始化程序中调用了单例对象——从而形成了运行时无法退出的无限循环.


如果您是从 Google 来的...在使用非可选变量创建 Singleton 对象时,请确保变量的初始化程序不引用初始化它们的单例。基本上,避免无意中创建无限循环。

更新:已向 Swift 团队提交错误报告雷达。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多