gpt4 book ai didi

ios - deinit 到底在做什么?为什么?

转载 作者:行者123 更新时间:2023-11-28 15:37:59 26 4
gpt4 key购买 nike

我的问题与为 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/

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