gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 05:33:52 25 4
gpt4 key购买 nike

我正在使用 UISplitViewController每次单击 Master VC 中的一行时,我都可以看到 viewDidLoad()在 Detail VC 中运行。

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

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

我有点迷失在 Swift 中。以前我可以在 dealloc() 中使用 NSLog 并查看 UIViewController正确卸载。

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

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

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
}
}

我所做的与我见过的很多例子没有什么不同,但我担心 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 属性的 View ,该属性引用回 View Controller 。这将导致强引用循环(以前称为保留循环),因为 View Controller 维护对其顶层 View 的强引用,而这反过来又维护返回 View Controller 的强引用。

The Swift Programming Language: Automatic Reference Counting解决类实例之间的强引用循环部分中, Apple 描述了如何解决这个问题:

Swift provides two ways to resolve strong reference cycles when you work with properties of class type: weak references and unowned references.

Weak and unowned references enable one instance in a reference cycle to refer to the other instance without keeping a strong hold on it. The instances can then refer to each other without creating a strong reference cycle.

Use a weak reference whenever it is valid for that reference to become nil at some point during its lifetime. Conversely, use an unowned reference when you know that the reference will never be nil once it has been set during initialization.

因此,您可以通过将 delegate 定义为 weak 来解决强引用循环:

weak var delegate: ManageViewDelegate? 

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

protocol ManageViewDelegate: class {
// your protocol here
}

这将解决强引用循环,并且无需手动nil delegate 来解决强引用循环。

关于iOS:如何检查 UIViewControllers 是否正在卸载? ( swift ),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26958162/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com