Быстрый доступ Singleton в триггерах Objective C EXC_BAD_INSTRUCTION (EXC_I386_INVOP) - PullRequest
0 голосов
/ 10 января 2019

Я создал одноэлементный объект в Swift 4.2 и пытаюсь получить к нему доступ (вызвать несколько методов) в классе Objective-C. Однако при вызове экземпляра в Objective-C приложение вылетает со следующим:

EXC_BAD_INSTRUCTION (код = EXC_I386_INVOP, субкод = 0x0)

enter image description here

Мое одноэлементное определение 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
    }
}

1 Ответ

0 голосов
/ 16 января 2019

При первом обращении к Singleton в Objective-C каждая переменная, хранящаяся в классе, должна быть инициализирована.

Я обнаружил, что происходящее (и то, что делало это таким разочаровывающим), было то, что один из инициализируемых объектов делал обратные вызовы к объекту-одиночке в своем собственном инициализаторе - таким образом формируя бесконечный цикл, из которого среда выполнения не могла выйти .

<ч /> Если вы пришли сюда из Google ... при создании объекта Singleton с не необязательными переменными, убедитесь, что инициализаторы переменных не ссылаются на синглтон, из которого они инициализируются. По сути, избегайте непреднамеренного создания бесконечных циклов.

ОБНОВЛЕНИЕ: Радар с отчетом об ошибках был подан в команду Swift.

...