【问题标题】:Swift MacOX - Popover segue creates multiple view controller instances without destroying them when they are dismissedSwift MacOX - Popover segue 创建多个视图控制器实例而不在它们被解除时销毁它们
【发布时间】:2019-08-25 03:34:00
【问题描述】:

我正在像这样在情节提要中创建一个弹出式样式视图控制器

然后我点击按钮,视图控制器显示,当我点击外面的任何地方时,视图控制器被“关闭”。

但是,当我再次单击该按钮时,视图控制器的新实例已启动,而前一个实例仍在运行。我试过deinit,但是当视图控制器被“解雇”时它没有被调用。

如何在外部单击时销毁视图控制器实例,或“显示”已创建的实例?

我在视图控制器中的代码:

class FileTransViewController: NSViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do view setup here.
        timer = Timer.scheduledTimer(timeInterval: 0.25, target: self, selector: #selector(updateProgress), userInfo: nil, repeats: true)
        //print(123)
        print("\(self)")
    }

    deinit {
        print("destroyed")
        if let timer = timer {
            timer.invalidate()
        }
    }

    @objc func updateProgress() {
        print("updating progress")
    }

}

【问题讨论】:

    标签: swift macos segue popover nsviewcontroller


    【解决方案1】:

    问题与弹出框无关。您正在泄漏,因为您保留了计时器,而计时器保留了您——一个经典的保留周期。

    要中断循环,您必须使计时器无效。您不能在deinit 中执行此操作,因为根据定义,直到您中断循环之后才能调用它。 NSPopover.willCloseNotification 可能是个好机会。

    【讨论】:

    • 明白了!感谢您的提示!我能够在NSPopover.willCloseNotification 期间打破圈子
    【解决方案2】:

    正如@matt 所说,您的保留周期有问题。您可以使用 Timer with 块来避免它,您可以在其中声明 weak 引用 self

    timer = Timer.scheduledTimer(withTimeInterval: 0.25, repeats: true) { [weak self] timer in
        guard let self = self else {
            timer.invalidate()
            return
        }
        print("updating progress")
    }
    

    在这种情况下,您也不需要deinit,因为您在guardelse 块内使计时器无效,并且您也不需要变量timer,您可以只写Timer如果您不想在其他地方手动使计时器无效

    override func viewDidLoad() {
        super.viewDidLoad()
        Timer.scheduledTimer(...) { ... }
    }
    

    【讨论】:

    • 谢谢!我也喜欢这个答案!
    • @Fangming 在这种情况下您也不需要deinit,因为您在guard else 块内使其无效。 timer 也不需要变量,如果您不想在其他地方手动使计时器无效,则可以写 Timer
    • 是的。谢谢!现在干净多了
    • @matt 是的,谢谢你的评论。无论如何,我喜欢我的方法,即您不需要 Timer 的变量,如果 self 被取消初始化,您可以简单地使其无效,您也可以摆脱声明 deinit
    猜你喜欢
    • 2023-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多