deinit in empty swift 未调用项目

deinit in empty swift Project not called

如果我使用 xcode(6.3.2) 创建一个新的 "Single View Application" 项目,并且只向 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 函数不可靠?

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

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

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

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