【发布时间】:2016-01-11 18:19:18
【问题描述】:
它seems like the Swift equivalent of dealloc is deinit。但是,当您尝试在 UIViewController 上定义该方法时,它的行为与您预期的不同...
设置
- 在 Swift 或 Objective-C 中使用 Xcode 7.0 创建一个新的 Single View 项目。
- 在使用情节提要创建的视图控制器上添加一个“关闭”按钮(我将此视图控制器称为 VC2;它的类是 ViewController)。
- 添加一个新的视图控制器并将其设置为初始视图控制器(VC1,类为 nil)。
- 在 VC1 中添加一个“present”按钮,并在 VC2 中添加“Present Modally”segue。
- 在 VC2 的代码中,在
deinit(Swift) 或dealloc(Objective-C) 中放置一个断点。 -
在 VC2 中,让“关闭”按钮的动作如下:
// Swift: presentingViewController?.dismissViewControllerAnimated(true, completion: nil) // Objective-C: [self.presentingViewController dismissViewControllerAnimated:YES completion:nil]; - 运行应用程序并点按两个按钮以首先显示 VC2,然后将其关闭。
注意在 Objective-C 中,dealloc 断点是如何命中的。
另一方面,在 Swift 中,deinit 断点永远不会被命中。
为什么从未调用过deinit?这是一个错误还是设计使然?
如果这是设计使然,当不再需要视图控制器时,我应该在哪里放置清理代码以释放资源? (它不能在 viewDidUnload 中,因为该方法已被弃用。它不能在 viewDidDisappear 中,因为其他东西可能持有对它的引用并最终会再次显示它。)
注意:如果您尝试在 Swift 中定义 dealloc 方法,则会收到以下错误:
Objective-C 选择器“dealloc”的方法“dealloc()”与具有相同 Objective-C 选择器的反初始化器冲突。
如果你的 Swift 视图控制器继承自一个 Objective-C 控制器,并且你在 Objective-C 的 dealloc 方法中放置了一个断点,你将得到与上面定义的相同的错误行为:deinit 将不会被调用,但dealloc 将被调用。
如果您尝试使用 Allocations 查看内存中类的实例数,两个版本显示相同的内容:# Persistent 始终为 1,并且每次显示第二个视图控制器时,# Transient 都会增加.
鉴于上述设置,不应有strong reference cycle 持有视图控制器。
【问题讨论】:
标签: ios objective-c swift memory-management uiviewcontroller