【发布时间】: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