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 快死了...
可应要求提供示例项目。 (写信给我)
如果我使用 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 快死了...
可应要求提供示例项目。 (写信给我)