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

Ric*_*ard 10 uisplitviewcontroller ios swift

UISplitViewController每次点击Master VC中的一行时都会使用,我可以看到它viewDidLoad()在Detail VC中运行.

这是否意味着我每次点击都会创建一个新的Detail VC实例?

如果是这样,我如何检查Detail VC是否正确卸载并且我不只是创建越来越多的新Detail VC?

我在斯威夫特有点失落.以前我可以在dealloc()中使用NSLog并查看UIViewController正确的卸载.

我在这里Swift有一个deinit函数,但从未调用过:

deinit {
    println("\(__FILE__.lastPathComponent)) : \(__FUNCTION__)")
    NSNotificationCenter.defaultCenter().removeObserver(self)
}
Run Code Online (Sandbox Code Playgroud)

1)我应该把我的观察员移到哪里?

2)当我查看Xcode中的Debug Navigator时,内存使用率一直在上升而且从不下降.

更新:详细信息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
    }
}
Run Code Online (Sandbox Code Playgroud)

我没有做过与我见过的很多例子不同的事情,但我担心deinit没有被召唤

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

我原来的非工作代码是:

protocol ManageViewDelegate {
    func pressedButton(sender: AnyObject)
}

class ManageView: UIView {
    var delegate: ManageViewDelegate? = nil
    ...
}
Run Code Online (Sandbox Code Playgroud)

新工作代码:

protocol ManageViewDelegate: class {
    func pressedButton(sender: AnyObject)
}

class ManageView: UIView {
    weak var delegate: ManageViewDelegate? = nil
    ...
}
Run Code Online (Sandbox Code Playgroud)

Rob*_*Rob 25

您有一个视图,其delegate属性引用回视图控制器.这将导致强大的参考周期(以前称为保留周期),因为视图控制器维持对其顶级视图的强引用,这反过来又维持了对视图控制器的强引用.

Swift编程语言:自动引用计数的类实例之间解析强引用循环部分中,Apple描述了如何解决这个问题:

当您使用类类型的属性时,Swift提供了两种解决强引用循环的方法:弱引用和无引用引用.

弱引用和无引用引用使引用周期中的一个实例能够引用另一个实例而不保持强大的保持.然后,实例可以相互引用而不会创建强大的参考周期.

weak只要对该引用有效的引用nil在其生命周期中的某个时刻使用引用.相反,unowned当您知道nil在初始化期间一旦设置引用将永远不会引用时,请使用引用.

因此,您可以通过定义以下内容delegate来解决强引用周期weak:

weak var delegate: ManageViewDelegate? 
Run Code Online (Sandbox Code Playgroud)

为此,您必须将协议指定为类协议:

protocol ManageViewDelegate: class {
    // your protocol here
}
Run Code Online (Sandbox Code Playgroud)

这既解决了有力的参考周期,无需手动nildelegate,以解决强引用循环.