Firebase observeSingleEvent保留在内存中

use*_*902 26 xcode ios firebase swift firebase-realtime-database

我的应用程序使用firebase的observeSingleEventOfType相当一点点,我开始意识到我的应用程序的内存随着时间的推移而增加.除了调用以下函数的测试按钮之外,我已经注释掉了我的所有代码.

func loadPostsTest() {
    FIRDatabase.database().reference().child("posts").observeSingleEventOfType(.Value, withBlock: { (snapshot: FIRDataSnapshot) in
        print(snapshot.value)
    })
}
Run Code Online (Sandbox Code Playgroud)

当程序启动时,我以大约2,3次的快速速度点击测试按钮并观察内存图,如下所示.内存上升,请求后不会恢复.从长远来看,这个问题影响我的应用程序,因为我的应用程序的内存将从70mb增长到150 + mb因此.有什么理由吗?

请注意,短暂的五秒休息是我停下来确保打印出所有"快照".

注2 ...当我停止按下按钮时,存储器保持与"短休息区"中所示的相同的水平.只是因为你认为它会无限期地自我增长

记忆图像

-------更新----------

为了进一步确认这个问题,我创建了一个全新的项目,其中没有任何内容,但是firebase导入,故事板中的一个按钮,带有以下代码并在我的6s上模拟(模拟器上的模拟似乎没有这个问题).下面的图片证明这里有一些可疑的火灾基地,因为我的记忆从11.1mb变为17.3mb,一分钟左右就有303个请求.

memoryleak2

import UIKit
import Firebase

class ViewController: UIViewController {

var count: Int = 0

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.
}

@IBAction func testBtnPressed(sender: AnyObject) {
    FIRDatabase.database().reference().child("posts").observeSingleEventOfType(.Value, withBlock: {[weak self] (snapshot: FIRDataSnapshot) in
        print(self?.count)
        self?.count += 1
    })
}
Run Code Online (Sandbox Code Playgroud)

dbb*_*ess 10

这可能只发生,因为您正在运行调试版本.在使用调试版本对设备进行~128次点击后,我的结果如下:

在设备上点击~128后增加内存消耗.

如您所见,绝大多数内存消耗是由于与调试相关的性能工具.如果您想通过编辑方案进行确认,可以禁用此功能:

编辑你的计划

然后禁用回溯录制:

禁用回溯录制.

禁用它后,相同的~128次点击基本上没有增长:

在设备上点击~128后,内存消耗没有增加.

当然,您可能不希望保留该禁用,因为您可能会发现它对于诊断崩溃和调试版本中的其他问题很有用.它应该不是发布版本中的问题!

作为参考,这是我运行的代码:

import UIKit
import FirebaseDatabase

class ViewController: UIViewController {

    @IBOutlet weak var label: UILabel!
    private var count: Int = 0

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
    }

    @IBAction func testBtnPressed(sender: AnyObject) {
        let db = FIRDatabase.database().reference()
        db.child("posts").observeSingleEventOfType(.Value) { [weak self] (snap: FIRDataSnapshot!) in
            guard let this = self else { return }
            this.count = this.count + 1
            this.label.text = "\(this.count)"
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 嗯,是的,如果你启用它启动它.但是,您的用户不会以这种方式启动它.尝试取消选中"Debug Executable"选项.您仍然可以在启动后附加调试器(Debugger> Attach to Process)以查看内存使用情况......这对我来说也是如此. (2认同)