deinit in empty swift Project not called

时间:2015-06-29 09:30:35

标签: swift deinit

如果我用xcode(6.3.2)创建一个新的“单视图应用程序”项目,并且只向ViewController添加一个deinit函数。运行应用,关闭应用。从来没有叫过Deinit!我用几台设备和模拟器测试了它。

deinit {
    println("deinit:")
}

为什么?这是标准行为吗?我能做些什么让它发挥作用?

/ *编辑* /阅读完评论后,我将此代码放入我的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函数不可靠?

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

正如苹果在文档中所述,应用程序终止是通过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死亡......

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