macOS 10.13 EXEC_BAD_ACCESS, вызванный подклассом NSTableView или NSScrollView

Я столкнулся с довольно странной проблемой. С подклассом некоторых NSViews, NSTableView и NSScrollView, чтобы быть конкретными.

Ситуация: я работаю над довольно старым (около 7 лет) проектом для macOS. Кодовая база примерно на 50% состоит из objc и на 50% из swift 3.2 и использует файлы XIB для отдельных представлений. Приложение работает без сбоев на 10.10 - 10.12, но на 10.13 происходит сбой практически мгновенно.

backtrace показывает следующее:

* thread #1, queue = 'com.apple.main-thread', stop reason = EXC_BAD_ACCESS (code=1, address=0x0)
frame #0: 0x00007fff50490b05 Foundation`_NSKVONotifyingCreateInfoWithOriginalClass + 177
frame #1: 0x00007fff50490a35 Foundation`_NSKeyValueContainerClassGetNotifyingInfo + 59
frame #2: 0x00007fff504908c4 Foundation`-[NSKeyValueUnnestedProperty _isaForAutonotifying] + 75
frame #3: 0x00007fff5049075f Foundation`-[NSKeyValueUnnestedProperty isaForAutonotifying] + 75
frame #4: 0x00007fff5048f9fb Foundation`-[NSObject(NSKeyValueObserverRegistration) _addObserver:forProperty:options:context:] + 490
frame #5: 0x00007fff5048e7c9 Foundation`-[NSObject(NSKeyValueObserverRegistration) addObserver:forKeyPath:options:context:] + 103
frame #6: 0x00007fff504da865 Foundation`-[NSKeyValueNestedProperty object:withObservance:didChangeValueForKeyOrKeys:recurse:forwardingValues:] + 411
frame #7: 0x00007fff504af6d8 Foundation`NSKeyValueDidChange + 179
frame #8: 0x00007fff505eb370 Foundation`NSKeyValueDidChangeWithPerThreadPendingNotifications + 132
frame #9: 0x00007fff4c2ac3a0 AppKit`-[NSView didChangeValueForKey:] + 93
frame #10: 0x00007fff504aff4d Foundation`NSKeyValueNotifyObserver + 350
frame #11: 0x00007fff504af800 Foundation`NSKeyValueDidChange + 475
frame #12: 0x00007fff505eb370 Foundation`NSKeyValueDidChangeWithPerThreadPendingNotifications + 132
frame #13: 0x00007fff4c2ac3a0 AppKit`-[NSView didChangeValueForKey:] + 93
frame #14: 0x00007fff4bbf6877 AppKit`-[NSScrollView _makeUnderTitlebarView] + 165
frame #15: 0x00007fff4b9e9eff AppKit`-[NSScrollView _updateStateOfUnderTitlebarView] + 327
frame #16: 0x00007fff4bae5ef1 AppKit`-[NSScrollView viewDidMoveToWindow] + 113
frame #17: 0x00007fff4b9e82b2 AppKit`-[NSView _setWindow:] + 2867
frame #18: 0x00007fff4b9efe9d AppKit`-[NSScrollView _setWindow:] + 500
frame #19: 0x00007fff4e3ef79f CoreFoundation`-[__NSArrayM enumerateObjectsWithOptions:usingBlock:] + 239
frame #20: 0x00007fff4c2acfed AppKit`__21-[NSView _setWindow:]_block_invoke.604 + 141
frame #21: 0x00007fff504c9b4a Foundation`-[NSISEngine withBehaviors:performModifications:] + 131
frame #22: 0x00007fff4b9e602d AppKit`-[NSView(NSConstraintBasedLayout) _withAutomaticEngineOptimizationDisabled:] + 70
frame #23: 0x00007fff4b9e8203 AppKit`-[NSView _setWindow:] + 2692
frame #24: 0x00007fff4b9e52d5 AppKit`-[NSView addSubview:] + 257
frame #25: 0x00007fff4ba1e228 AppKit`-[NSFrameView addSubview:] + 44
frame #26: 0x00007fff4ba1e1ed AppKit`-[NSThemeFrame addSubview:] + 381
frame #27: 0x00007fff4ba1df1a AppKit`-[NSView addSubview:positioned:relativeTo:] + 214
frame #28: 0x00007fff4c2593bd AppKit`-[NSThemeFrame addSubview:positioned:relativeTo:] + 42
frame #29: 0x00007fff4ba1de37 AppKit`-[NSThemeFrame _addKnownSubview:positioned:relativeTo:] + 38
frame #30: 0x00007fff4ba43853 AppKit`-[NSWindow setContentView:] + 382
frame #31: 0x000000010007e8da MyApp`-[Document someContentViewItemSelected:](self=0x000060403b97eef0, _cmd="someContentViewItemSelected:", sender=0x0000604043fb0f60) at Document.m:230

Обратная трассировка не очень полезна (но, возможно, я что-то упускаю), но ошибка возникает, когда представление нового ViewController назначается представлению содержимого листа окна self.windowForSheet.contentView = contentViewController.view.

Проблема: представление этого контроллера имеет представление NSTableview, которое я создал подклассом и присвоил класс в построителе интерфейса объекту таблицы. Если я удалю этот подкласс, все будет работать нормально.

Что я пробовал:

Я попытался воспроизвести проблему с полностью пустыми подклассами, написанными в objc и swift, и с обоими проблема возникает, и приложение вылетает с точным такая же обратная связь.

Я попытался создать новое приложение, используя xib с контроллером представления и подклассом NSTableView, и оно отлично работает!

Я попытался скомпилировать приложение с помощью Xcode 8.3.3 (на 10.12 и 10.13) и 9.1 (на 10.13), и полученные приложения показывают такое же поведение, отлично работают на 10.12, 10.11, но вылетают на 10.13.

Я предполагаю, что все это связано с тем, что это очень старый проект со смешанными языками и устаревшими xib-файлами, но я не могу указать пальцем на специфику.

Вопрос: Ребята, вы знаете, в чем может быть проблема? Были проблемы с созданием подклассов NSTableView или NSScrollView (кстати, подклассы NSTableViewCell прекрасно работают).

Я ценю каждую помощь или вклад, который вы можете мне дать. Спасибо


person Laniakaeus    schedule 06.11.2017    source источник
comment
Если новый проект с подклассом NSTableView не падает, то я не уверен, как мы можем диагностировать его отсюда. Сделать копию проекта и продолжать удалять части, пока не заработает?   -  person Ssswift    schedule 06.11.2017
comment
Как вы думаете, какое окно возвращается из windowForSheet?   -  person Willeke    schedule 06.11.2017
comment
@Willeke Поскольку это приложение, основанное на документах, это главное (обычно только 1) окно (NSWindow).   -  person Laniakaeus    schedule 07.11.2017
comment
@Ssswift К сожалению, я не могу предоставить исходный проект. Мой текущий подход состоит в том, чтобы перенести файл xib в раскадровку и посмотреть, не вызывает ли там проблему подкласс.   -  person Laniakaeus    schedule 07.11.2017
comment
Вы хотите назначить contentViewController.view главному окну или листу?   -  person Willeke    schedule 07.11.2017
comment
@Willeke Как я уже упоминал в своем описании, доступ к представлению или его настройка — это не проблема, а скорее первая видимая точка, в которой проявляется симптом проблемы. Если представление, которое я назначаю содержимому окна, не содержит подкласса tableview или вообще не содержит таблицы, все работает нормально.   -  person Laniakaeus    schedule 07.11.2017
comment
Аналогичная проблема: Сбой при загрузке Xib, когда он содержит NSSCrollView   -  person Willeke    schedule 09.11.2017


Ответы (1)


Попробуйте обновить старые фреймворки. У меня была такая же проблема с Спаркл. Обновление с 1.8.0 до 1.18.1 устранило две похожие ошибки.

(около 7 лет) проект для macOS.

Печально, но не нашел точного коммита в Sparkle, исправляющего сбой. Я думаю, что это между версиями 1.8.0 и 1.9.0. Пожалуйста, дайте мне знать, если вы обнаружите, что точная строка кода вызвала сбой.

person Nuzhdin Vladimir    schedule 10.11.2017
comment
Я дам Вам знать. Спасибо за ответ. - person Laniakaeus; 27.11.2017
comment
Удивительный! Искра 1.8 была проблемой. Спасибо большое за помощь! К сожалению, просмотр сверкающих коммитов также не показал мне корень проблемы. - person Laniakaeus; 27.11.2017
comment
Я тоже просмотрел эти коммиты (не внимательно)... И не нашел причину. Рад, что мой ответ был полезен для вас. - person Nuzhdin Vladimir; 27.11.2017
comment
Если вы когда-нибудь будете в Швейцарии, дайте мне знать. Я должен тебе пиво! - person Laniakaeus; 27.11.2017
comment
ура! Из Одессы с ООП в сердце =) - person Nuzhdin Vladimir; 27.11.2017