NSView не освобождается - PullRequest
       27

NSView не освобождается

1 голос
/ 18 марта 2019

У меня здесь странная ситуация, которая почти наверняка связана с тем, что я новичок в разработке для 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 подсчет ссылок всегда был проблемой, но были схемы, чтобы обращаться с ними аккуратно.

Любой совет приветствуется.

1 Ответ

0 голосов
/ 31 марта 2019

Я обновил всех своих делегатов до weak var, и это решило все мои проблемы с освобождением.

...