- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我的问题与为 Firebase 提供的示例代码有关。您可以在 Github 上找到它或在 Documentation .无论如何,我真的不明白数据库引用上的“deinit”在做什么。我阅读了 deinit swift 文档 here .我想我理解使用 deinit 的目的,但我不确定在这种情况下它是如何工作的。
let kBannerAdUnitID = "ca-app-pub-3940256099942544/2934735716"
@objc(FCViewController)
class FCViewController: UIViewController, UITableViewDataSource, UITableViewDelegate,
UITextFieldDelegate, UIImagePickerControllerDelegate, UINavigationControllerDelegate,
InviteDelegate {
// Instance variables
@IBOutlet weak var textField: UITextField!
@IBOutlet weak var sendButton: UIButton!
var ref: DatabaseReference!
var messages: [DataSnapshot]! = []
let posts = [Post]()
var msglength: NSNumber = 10
fileprivate var _refHandle: DatabaseHandle!
var storageRef: StorageReference!
var remoteConfig: RemoteConfig!
@IBOutlet weak var banner: GADBannerView!
@IBOutlet weak var clientTable: UITableView!
override func viewDidLoad() {
super.viewDidLoad()
self.clientTable.register(UITableViewCell.self, forCellReuseIdentifier: "tableViewCell")
configureDatabase()
configureStorage()
configureRemoteConfig()
fetchConfig()
loadAd()
logViewLoaded()
}
deinit {
// NOT REALLY SURE WHAT THIS DOES
if let refHandle = _refHandle {
self.ref.child("messages").removeObserver(withHandle: _refHandle)
}
}
func configureDatabase() {
ref = Database.database().reference()
// Listen for new messages in the Firebase database
_refHandle = self.ref.child("messages").observe(.childAdded, with: { [weak self] (snapshot) -> Void in
guard let strongSelf = self else { return }
// EACH SNAPSHOT IS PLACED IN THE MESSAGES ARRAY
strongSelf.messages.append(snapshot)
// MAKE THE NUMBER OF ROWS IN THE FEED == THE NUMBER OF SNAPSHOTS
strongSelf.clientTable.insertRows(at: [IndexPath(row: strongSelf.messages.count-1, section: 0)], with: .automatic)
})
}
最佳答案
在初始化期间,您的 View Controller 向给定的 Firebase 数据库节点添加一个 childAdded
观察器。传入的闭包仍将被调用 even 在 View Controller 早已消失(即释放)之后。 Firebase 保留对它的强 引用(顺便说一句,还有对您的 View Controller 的弱 引用)。这种不必要的调用可能不是一个主要问题(现在!),但它仍然是错误的。
deinit
代码阻止了这种情况的发生。
deinitializer 在您的 View Controller 被释放之前立即被调用。因此,它提供了一个从上述数据库节点删除那个观察者的好地方。观察者(引用)存储在 _refHandle
属性中。
顺便说一下,您可以简化您的观察者删除代码:
if let refHandle = _refHandle {
self.ref.removeObserver(withHandle: _refHandle)
}
您不需要在其注册的相同节点上调用removeObserver
。
弱 View Controller 。在上述闭包中,[weak self]
限定符指定 Firebase 应仅保留对 View Controller 的弱引用。这对于确保 View Controller 在不再需要时从内存中正确释放至关重要。没有它,您的 deinit
将永远不会被调用!
关于ios - deinit 到底在做什么?为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44089153/
从 ios 9 开始,没有必要从通知中心取消订阅,因为 ios 会自动处理这一点,但在 ios 9 之前,开发人员必须手动调用 NotificationCenter.default.removeObs
我在阅读 The Swift Programming Language guide 时遇到了一个名为 deinit() 的函数,但我仍然想知道为什么以及何时需要实现它,因为我们实际上并不需要管理内存。
我有一个包含完成处理程序的网络任务,允许我确定任务是否以及何时成功完成; func performUpload(url: URL, completionHandler: @escaping (_ re
这似乎出现在我们项目中的两个 Controller 上。我检查了代码和 Storyboard, Storyboard中的 segue 没有在 Controller 中调用,没有与将触发 segue 的
今天遇到一个问题,vc从来不调用deinit,所以我加了一个weak func showAddCityViewController() { weak var vc:SWAddCityV
这是我的代码。我不明白为什么不调用 deinit。 class SplashVC: UIViewController { init() { super.init(nibName
我想知道是否有可能在我的 View Controller 中使用惰性属性,并在 deinit 方法中仅在初始化时调用我的惰性属性的方法。下面是一些代码: fileprivate lazy var se
我有以下测试用例:我希望 deinit 在程序终止时被调用,但它从来没有。我是 Swift 的新手,但不认为这是预期的行为。 (这不是在 Playground 上) class Test { i
我正在创建一个 ViewController 对象并将其推送到导航 Controller 。当对象从堆栈中弹出时 - 它没有被释放并且没有调用 Deinit。这可能是什么原因? 这是推送的代码: se
我有一个正常的table view在一个全新的项目中,没有额外的代码。在我的 Storyboard中,我有 2 个 View Controller 和一个 navigation controller嵌
这是我的单元测试: func testDeinit() { let view = DocumentsView(theme: MockTheme()) let v
我从 Swift 指南中的无主引用部分复制了大部分代码,并在 Playground 中运行它...... class Customer { let name: String var c
在UIViewController deinit方法中未在ios swift4.2中调用 我已尝试使用以下代码在 popToViewcontroller 导航后导航到下一个 viewControlle
所以我的 deinit 函数从未被调用,我已经在寻找答案,但没有一个对我有用。由于内存问题, View Controller 不断崩溃。感谢您的帮助! 这是我的代码: @IBOutlet weak v
我的问题与为 Firebase 提供的示例代码有关。您可以在 Github 上找到它或在 Documentation .无论如何,我真的不明白数据库引用上的“deinit”在做什么。我阅读了 dein
我有一个父类和一个子类。父项对子项有强引用,子项对父项有无主引用。在 parent 的 deinit 期间,我希望 child 做一些清理工作,这涉及调用 parent: class ViewCont
从我的 UINavigationController 堆栈的一些 ViewController 我呈现另一个 ViewController 并且永远不会回来,但问题是 deinit {} 未被调用。我
有几个资源( blog , SO question ,而且我已经看到它无处不在)建议从 deinit 的 NotificationCenter 中删除观察者UIViewController,例如: d
在 swift deinit 方法中使用 self 是好习惯吗?。在 objective-c 中,我们避免在 init 和 dealloc 方法中使用 self。swift 也一样吗? 最佳答案 在
几天前我发布了一个问题here我仍然没有找到答案。我认为这是一个错误,希望将来能修复它,但不禁认为这也可能是我自己做错的事情。 有了这个问题,我希望能够确认这是一个错误,这样我就可以继续从事我的项目,
我是一名优秀的程序员,十分优秀!