Что может быть причиной того, что @IBOutlet был нулевым после загрузки NSViewController - PullRequest
0 голосов
/ 16 октября 2019

Я загружаю представление, используя: "_ = vc.view", но приложение вылетает, когда я пытаюсь получить доступ к его розетке.

Как я выяснил линию сбоя?

Iполучил журнал сбоев:

Crashed Thread:        0  Dispatch queue: com.apple.main-thread

Exception Type:        EXC_BAD_INSTRUCTION (SIGILL)
Exception Codes:       0x0000000000000001, 0x0000000000000000
Exception Note:        EXC_CORPSE_NOTIFY

Termination Signal:    Illegal instruction: 4
Termination Reason:    Namespace SIGNAL, Code 0x4
Terminating Process:   exc handler [3342]

Thread 0 Crashed:: Dispatch queue: com.apple.main-thread
0   MyApp                       0x0000000345345 0x10d9bd100 + 223945

Я использовал DSYM & atos и получил аварийную строку:

    firstContainer = AppFactory.shared.buildAtomPresenterContainer(for: vc.firstContainerView)

AppFactory.shared - неопциональное статическое let. И никакие другие потоки не выполняли мой код.

Воспроизводимость: только один журнал сбоев. (Никакой дополнительной информации, предоставленной пользователем) Всегда работал нормально, кроме случая. Я не могу воспроизвести проблему.

Код:

class TwoComponentsSplitViewPresenterImpl: TwoComponentsSplitViewPresenter {

    let vc: TwoComponentsSplitViewController
    let firstContainer: AtomPresenterContainer
    let secondContainer: AtomPresenterContainer

    init() {
        let name = NSNib.Name("TwoComponentsSplitViewController")
        vc = TwoComponentsSplitViewController(nibName: name, bundle: nil)

        // preload
        _ = vc.view

        firstContainer = AppFactory.shared.buildAtomPresenterContainer(for: vc.firstContainerView)//< - - - Crashes here
        secondContainer = AppFactory.shared.buildAtomPresenterContainer(for: vc.secondContainerView)
    }

}


class TwoComponentsSplitViewController: NSViewController, NSSplitViewDelegate {

    @IBOutlet weak var splitView: CustomizedSplitView!

    @IBOutlet weak var firstContainerView: NSView!
    @IBOutlet weak var secondContainerView: NSView!

}

Я прочитал вопрос , но приложение всегда падает там, и у меня естьтолько сбой, поэтому я решил, что проблема в другом.

Я думал о прямом вызове loadView () . Но сказано, что мой способ загрузки является подходящим:

Не вызывайте этот метод. Если вам требуется, чтобы этот метод вызывался, откройте свойство view.

  • XCode (где был создан архив): Версия 10.1 (10B61)
  • Версия ОС (при сбое)состоялся): Mac OS X 10.15 (19A583)
...