Objective-C中的快速单例访问触发EXC_BAD_指令(EXC_I386_INVOP)
我在Swift 4.2中创建了一个单例对象,并试图在Objective-C类中访问它(调用几个方法)。但是,在Objective-C中调用实例时,应用程序会崩溃,原因如下: EXC_BAD_指令(代码=EXC_I386_INVOP,子代码=0x0) 我的Swift单例定义并没有什么不寻常的地方,当仅从其他Swift类调用时,它工作得很好。下面是它的样子:Objective-C中的快速单例访问触发EXC_BAD_指令(EXC_I386_INVOP),objective-c,swift,singleton,Objective C,Swift,Singleton,我在Swift 4.2中创建了一个单例对象,并试图在Objective-C类中访问它(调用几个方法)。但是,在Objective-C中调用实例时,应用程序会崩溃,原因如下: EXC_BAD_指令(代码=EXC_I386_INVOP,子代码=0x0) 我的Swift单例定义并没有什么不寻常的地方,当仅从其他Swift类调用时,它工作得很好。下面是它的样子: @objc public static let sharedManager = SessionManager() 项目中的语言互操作性似乎
@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];
有没有办法解决这个问题?我错过了什么?为什么singleton实例永远是零
编辑:我已经尝试将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对象——从而形成了一个运行时无法退出的无限循环
如果你是从谷歌来这里的。。。当使用非可选变量创建单例对象时,请确保变量的初始值设定项没有引用从中初始化变量的单例。基本上,避免无意中创建无限循环 更新:Swift团队已收到一份雷达缺陷报告
您在objective-c中调用什么方法?您可能在那里做了一些快速的工作,但不一定能很好地转化为objc运行时内存。向我们展示完整的单例代码。@根据苹果文档,从Swift 4开始的基因代码是创建单例的完整推荐方法。一行。看起来应该还有更多,因为这显然是一个问题。@AntwanvanHoudt我编辑了这个问题,在ObjC方面有更多细节。不幸的是,当从ObjC.Hmm访问“sharedManager”时,它看起来像是nil。。没有看到单身汉的班级部分??请看这里: