Cra sh при установке значения NSOrayController's managedObjectContext равным nil - PullRequest
0 голосов
/ 25 апреля 2020

У меня есть приложение MacOS на NSDocument с Core Data, которое по своей природе может иметь только один открытый документ за раз. Поэтому, когда открывается новый документ, я закрываю открытый в данный момент. Все связанные с документами пользовательские интерфейсы находятся в отдельном оконном контроллере, и все работает хорошо.

Но у меня также есть пункт меню, который переключает отдельное окно, в котором отображается некоторая информация о документе. Пользовательский интерфейс представляет собой простой NSTableView, привязанный к NSArrayController. Свойство managagedObjectContext контроллера массива устанавливается при изменении текущего документа. Это всегда приводит к взлому sh с EXC_BAD_INSTRUCTION.

Чтобы сузить проблему, я полностью удалил все привязки и любые другие манипуляции с контроллером массива. Cra sh ушел. Я также создал новый testArrayController в коде, чтобы посмотреть, что там происходит, и, конечно, я мог бы воспроизвести cra sh:

let testArrayController = NSArrayController()

var document: Document? {
    didSet {
        if document != nil {
            testArrayController.managedObjectContext = document?.managedObjectContext
            testArrayController.prepareContent()  // <---- this causes the crash later on
        } else {
            testArrayController.managedObjectContext = nil
        }
    }
}

override func viewDidLoad() {
    super.viewDidLoad()

    testArrayController.entityName = "MyEntity"
    ...
}

Кажется, что вызов prepareContent() каким-то образом блокирует контроллер массива для определяет c managedObjectContext и вызывает cra sh, когда он установлен в ноль.

Как можно безопасно «деактивировать» NSArrayController или изменить его managedObjectContext?

1 Ответ

0 голосов
/ 26 апреля 2020

После долгих экспериментов, я думаю, я обнаружил, что NSArrayController вызывает утечку памяти, как только вы вызываете fetch(_:) или preopareContent(). Кажется, что он сохраняет managedObjectContext и никогда не выпускает его. Несмотря на то, что все другие ссылки на контроллер были освобождены, я мог видеть протекший экземпляр в отладчике памяти.

Я обошел проблему, заменив привязки обычной NSTableViewDataSource реализацией.

...