2

如果我使用 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 函数不可靠?

4

2 回答 2

1

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

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

于 2015-06-30T06:16:47.353 回答
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 快死了……

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

于 2015-08-08T09:21:20.640 回答