未调用空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函数不可靠?

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

测试这一点的一种方法是创建一个新的ViewController并用它替换当前的ViewController。这应该会从内存中删除当前的View控制器,从而调用它的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正在消亡

样品项目可应要求提供。(给我写信)

相关内容

  • 没有找到相关文章

最新更新