У меня здесь странная ситуация, которая почти наверняка связана с тем, что я новичок в разработке для MacOS и мне не хватает некоторых базовых знаний.
У меня есть модальный лист, который я показываю программно. (Я не использую segu раскадровки, потому что он должен быть результатом проверки, и до сих пор я не видел способа запустить segue программно - это подвопрос, если у кого-то есть совет)
Вот как я это делаю:
searchVC = NSStoryboard(name: "Main", bundle: nil).instantiateController(withIdentifier: "SearchSceneIdentifier") as? SearchViewController
if searchVC != nil {
searchVC!.searchTerm = searchTextField.stringValue
self.presentAsSheet(searchVC!)
}
Это представляет лист хорошо и позволяет мне взаимодействовать с ним. В ней я использую класс с делегатом для возврата асинхронных поисковых запросов.
Что странно, когда я звоню
self.view.window!.close()
изнутри контроллера представления, я не думаю, что контроллер представления освобождается. Похоже, это связано с тем, что делегат все еще подключен к нему, даже если объект, имеющий этот делегат, находится в области действия самого контроллера представления. Этот делегат, кажется, держит контроллер представления в памяти.
Я справился с этим, прежде чем закрыть окно:
search.delegate = nil
Но это не очень хорошее решение для других контроллеров представления, имеющих ту же проблему, потому что они находятся внутри окон, и я не хочу отлавливать закрытие окна, а затем отправлять какое-то уведомление каждому для того, чтобы ноль если их делегаты.
Другой подход, который также кажется неправильным, заключается в том, что я сохраняю ссылку на эти окна в делегате приложения и ноль-если это оттуда.
Все это кажется неприятным решением проблемы освобождения, и я надеюсь, что есть более чистый способ сделать это. В Objective-C подсчет ссылок всегда был проблемой, но были схемы, чтобы обращаться с ними аккуратно.
Любой совет приветствуется.