Приложение macOS SwiftUI аварийно завершает работу с objc_release (EXC_BAD_ACCESS) после закрытия Onboarding NSWindowIOS

Программируем под IOS
Ответить
Anonymous
 Приложение macOS SwiftUI аварийно завершает работу с objc_release (EXC_BAD_ACCESS) после закрытия Onboarding NSWindow

Сообщение Anonymous »

Я создаю приложение строки меню macOS, используя SwiftUI и AppKit. У меня возникла проблема, из-за которой приложение аварийно завершает работу с EXC_BAD_ACCESS (code=1) внутри objc_release сразу после завершения процесса регистрации.
Последовательность действий:
  • Приложение запускается (только в строке меню политика активации IS_ACCESSORY).
  • Код: Выделить всё

    AppDelegate
    проверяет наличие разрешений на доступность.
  • Если они отсутствуют, открывается NSWindow (Onboarding), созданный программно.
  • Пользователь предоставляет разрешение -> нажимает «Начать».
  • Закрытие вызывает window.close(), устанавливает ссылку на окно nil и вызывает startEngine(), чтобы начать мониторинг NSEvent.
  • АВАРИЯ: приложение выходит из строя сразу или вскоре после закрытия окна и запуска механизма.
Если я остановлю и запущу приложение снова (с уже предоставленными разрешениями), оно будет работать отлично. Сбой происходит только при конкретном запуске, когда окно регистрации было открыто, а затем закрыто.
Сбой: Поток 1 (основной поток) завершает работу с objc_release. нет
libobjc.A.dylib`objc_release:
-> 0x187ff4120 : ldr x17, [x2, #0x20]

Код: Выделить всё

...

0x18802c7f4               ; objc_release_full
Соответствующий код:
AppDelegate.swift

Код: Выделить всё

class AppDelegate: NSObject, NSApplicationDelegate {

var onboardingWindow: NSWindow?

let inputEngine = InputEngine.shared

func showOnboarding() {

let onboardingView = OnboardingView { \[weak self\] in

// Completion closure

self?.onboardingWindow?.close()

self?.onboardingWindow = nil

// Start the main app logic after a short delay

DispatchQueue.main.asyncAfter(deadline: .now() + 0.3) {

self?.startEngine()

}

}

onboardingWindow = NSWindow(

contentRect: NSRect(x: 0, y: 0, width: 450, height: 500),

styleMask: \[.titled, .closable\],

backing: .buffered,

defer: false

)

onboardingWindow?.contentView = NSHostingView(rootView: onboardingView)

onboardingWindow?.makeKeyAndOrderFront(nil)

}

func startEngine() {

// Sets up event monitors

inputEngine.startMonitoring()

}

}
OnboardingView.swift (SwiftUI)

Код: Выделить всё

struct OnboardingView: View {

let onComplete: () -\> Void

var body: some View {

Button("Get Started") {

// Trigger the completion in AppDelegate

onComplete()

}

}

}
Что я пробовал:
  • Я подозревал, что таймер внутри OnboardingView срабатывает после освобождения представления, поэтому я заменил его на onReceive(NSApplication.didBecomeActiveNotification). Сбой сохраняется.
  • Я пытался использовать [weak self] везде в замыканиях.
  • Сбой, похоже, связан с разрушением NSWindow или NSHostingView, совпадающим с запуском мониторов NSEvent в InputEngine.
Кто-нибудь сталкивался с сбоем objc_release, особенно при переходе от закрытого NSWindow к запуску мониторинга фоновых событий?

Подробнее здесь: https://stackoverflow.com/questions/798 ... sing-onboa
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «IOS»