deinit не вызывается в стандартном приложении MacOS - PullRequest
0 голосов
/ 28 октября 2018

Я создал новое приложение из шаблона приложения MacOS Cocoa.Единственное изменение, которое я сделал, добавлено deinit в NSViewController.Итак, теперь это выглядит так (полный код):

import Cocoa

class ViewController: NSViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        // Do any additional setup after loading the view.
    }

    override var representedObject: Any? {
        didSet {
        // Update the view, if already loaded.
        }
    }

    func doSomething()
    {
        var a = 10
        a = a + 1
        print(a)
    }

    deinit {
        doSomething()
        print("deinit called")
    }
}

Почему я не вижу deinit звонок?Я искал несколько вопросов здесь, но не смог найти ответ, так как у меня нет цикла сохранения.

Ответы [ 2 ]

0 голосов
/ 28 октября 2018

Как говорит Тоби в своем ответе, deinit вызывается непосредственно перед освобождением объекта.

Объект освобождается, когда на него больше нет сильных ссылок.(Никто больше не владеет объектом.)

Чтобы ответить на ваш конкретный вопрос, вам нужно посмотреть, как создается ваш контроллер представления и кто владеет им.

В последнее время я мало занимался разработкой для Mac, поэтому мне немного не по себе жизненный цикл контроллера View, но я вспоминаю, как он работает:

Если у вас есть только одно приложениеокно, это владелец контроллера представления, и окно никогда не закрывается, это означает, что контроллер представления никогда не будет освобожден.

Если вы выйдете из приложения, я не думаю, что система разрушит вашу иерархию окон раньшеЗавершение работы приложения (если только вы не являетесь приложением на основе документов, и в этом случае приложению будет приказано закрыть все окна документов перед выходом.)

0 голосов
/ 28 октября 2018

Деинициализатор вызывается непосредственно перед тем, как экземпляр класса освобождается .

Хотя ваш вопрос мне не ясен.

Но обычной причиной неудачного запуска deinit, когда ожидается, является то, что у вас есть цикл сохранения, который не позволяет вашему контроллеру вида исчезнуть.

Иногда причина в том, что вы ожидаете, чтоВид контроллера был бы уничтожен при неверных обстоятельствах.

Но если предположить, что это правильно, причиной является цикл сохранения.

Другое предложение заключается в использовании Отладка иерархии .

ответьте на эти вопросы для себя.

это корень UIViewController?

правильно ли уволен?

...