Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective-C中的快速单例访问触发EXC_BAD_指令(EXC_I386_INVOP)_Objective C_Swift_Singleton - Fatal编程技术网

Objective-C中的快速单例访问触发EXC_BAD_指令(EXC_I386_INVOP)

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() 项目中的语言互操作性似乎

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

EXC_BAD_指令(代码=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];
有没有办法解决这个问题?我错过了什么?为什么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。。没有看到单身汉的班级部分??请看这里: