iOS:如何检查UIViewControllers是否卸载? (迅速)

每当我点击Master VC中的一行时,我使用的是UISplitViewController我可以看到viewDidLoad()在Detail VC中运行。

这是否意味着我创build一个新的细节VC每行点击实例?

如果是这样,我如何检查Detail VC正在卸载,而且我不只是创build越来越多的新的Detail VCs?

我在斯威夫特有点迷路了 以前我可以NSLog在dealloc(),并看到UIViewController正确卸载。

我在这里Swift有一个deinit函数,但这从来没有被称为:

 deinit { println("\(__FILE__.lastPathComponent)) : \(__FUNCTION__)") NSNotificationCenter.defaultCenter().removeObserver(self) } 

1)我应该在哪里删除我的观察员?

2)当我在Xcode的debugging导航器中查看内存使用情况只是继续上升,永远不会下降。

更新:详细VC被调用如下:

 if segue.identifier == "addEvent" { if let controller = (segue.destinationViewController as UINavigationController).topViewController as? ManageViewController { controller.manageEvent = nil controller.navigationItem.leftBarButtonItem = self.splitViewController?.displayModeButtonItem() controller.navigationItem.leftItemsSupplementBackButton = true } } 

我没有做过与我见过的很多例子不同的东西,但是我担心deinit不会被调用

更新:现在工作 – 问题是委托停止deinit被调用(见下面的答案)

我原来的非工作代码是:

 protocol ManageViewDelegate { func pressedButton(sender: AnyObject) } class ManageView: UIView { var delegate: ManageViewDelegate? = nil ... } 

新的工作代码:

 protocol ManageViewDelegate: class { func pressedButton(sender: AnyObject) } class ManageView: UIView { weak var delegate: ManageViewDelegate? = nil ... } 

你有一个delegate属性的视图引用回视图控制器。 这将导致强大的引用周期(以前称为保留周期),因为视图控制器保持对其顶层视图的强参考,而顶层视图继而保持强视图返回到视图控制器。

在“ 解决 Swift编程语言:自动引用计数的 类实例之间的强参考循环”一节中,Apple介绍了如何解决这个问题:

Swift提供了两种方法来处理强types的属性:弱引用和无主引用。

弱引用和无主引用使参考周期中的一个实例能够引用另一个实例,而不会对其保持强有力的保留。 然后这些实例可以互相引用而不会创build一个强大的引用循环。

使用一个weak引用,只要该引用在其有效期内在某个时间点成为nil 。 相反,如果知道在初始化过程中设置的引用永远不会nil ,则使用unowned引用。

因此,您可以通过定义delegateweak来解决您的强大的参考周期:

 weak var delegate: ManageViewDelegate? 

为了这个工作,你可能必须指定你的协议是一个类协议:

 protocol SomeDelegateProtocol: class { // your protocol here } 

这将解决强大的参考周期,并且无需手动清除delegate来解决强参考周期。

另外,如果你使用块,你需要添加[弱自我],否则,视图不会被破坏

  setupObserve(postID) { [weak self] chatRequest in self?.update() } 

deinit函数应该解决