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
引用。
因此,您可以通过定义delegate
为weak
来解决您的强大的参考周期:
weak var delegate: ManageViewDelegate?
为了这个工作,你可能必须指定你的协议是一个类协议:
protocol SomeDelegateProtocol: class { // your protocol here }
这将解决强大的参考周期,并且无需手动清除delegate
来解决强参考周期。
另外,如果你使用块,你需要添加[弱自我],否则,视图不会被破坏
setupObserve(postID) { [weak self] chatRequest in self?.update() }
deinit函数应该解决