【问题标题】:deinit in empty swift Project not called未调用空快速项目中的 deinit
【发布时间】:2015-06-29 09:30:34
【问题描述】:

如果我使用 xcode(6.3.2) 创建一个新的“单视图应用程序”项目,并且只向 ViewController 添加一个 deinit 函数。运行应用程序,关闭应用程序。 Deinit 永远不会被调用!我用几台设备和模拟器对其进行了测试。

deinit {
    println("deinit:")
}

这是为什么呢?这是标准行为吗?我该怎么做才能让它发挥作用?

/* 编辑 */ 在阅读完 cmets 之后,我把这段代码放到了我的 Viewcontroller 中。

import UIKit

class A {
    func test() {
        println("A test")
    }

    deinit {
        println("A deinit")
    }
}

class ViewController: UIViewController {

    var a:A? = A()

    override func viewDidLoad() {
        super.viewDidLoad()
        println("ViewController viewDidLoad")
        a?.test()
    }

    override func viewDidDisappear(animated:Bool) {
        println("ViewController viewDidDisappear")
        a = nil
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        println("ViewController didReceiveMemoryWarning")
    }

    deinit {
        println("ViewController deinit")
        a = nil
    }
}

现在我明白了

ViewController viewDidLoad:
A test
ViewController viewDidDisappear:
A deinit

这是否意味着我必须在 viewDidDisappear 调用中手动清理我的对象,因为视图控制器的 deinit 函数不可靠?

【问题讨论】:

  • 这个 ViewController 是否存在内存不足的时间点?你用另一个 viewController 替换这个 viewController 吗?
  • 没有。我所做的只是添加 deinit。没有其他的。您可以通过创建一个新的“单一视图应用程序”项目来测试它。然后使用 println 和/或断点添加 deinit。
  • Rob 是对的,它是重复的

标签: swift deinit


【解决方案1】:

没有。在这种情况下, ViewController deinit 甚至没有被调用,因为 ViewController 没有内存不足。

一种测试方法是创建一个新的 ViewController 并用它替换当前的 ViewController。这应该将您当前的 ViewController 从内存中删除,因此将其称为 deinit 方法。

【讨论】:

    【解决方案2】:

    正如苹果在文档中所述,应用程序终止是通过 SIGKILL 完成的,它比通过发送消息退出要快得多。

    因此不会调用任何代码,例如 applicationWillTerminate 也不会。

    试试这个代码:

    //  CustomView.swift
    import UIKit
    
    class CustomView: UIView {
    
        deinit{
            print("Swift CustomView dying...\n")
    
        }
    }
    

    在控制器中:

    var v : CustomView?
            v = CustomView(frame: CGRectZero)
    
            v = nil
    

    您将在控制台中:

    Swift CustomView 快死了...

    可根据要求提供示例项目。 (写给我)

    【讨论】:

    • 我想知道如果我通过UnsafeMutablePointer 分配一个内存块并且不为我的类(包含指针)使用可选类型并且应用程序终止,我的内存会发生什么?!我是否遇到内存泄漏,如果是,我该如何解决这个问题,因为当我的(命令行)应用程序终止且没有任何错误时,deinit 永远不会被调用。
    猜你喜欢
    • 1970-01-01
    • 2015-01-14
    • 2021-10-22
    • 1970-01-01
    • 2018-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多