Firebase observeSingleEvent保留在内存中

我的应用程序使用firebase的observeSingleEventOfType相当公平的一点,我开始意识到我的应用程序的内存随着时间的推移而增加。 我已经注释掉了我所有的代码,除了一个调用以下函数的testingbutton。

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

程序启动时,我以每秒约2,3次的速度快速按下testingbutton,观察内存图如下图所示。 内存上升,请求后不会回落。 这个问题从长远来看影响了我的应用程序,因为我的应用程序的内存将从70mb增长到150 + mb。 有什么理由呢?

请注意,短暂的五秒rest是我停下来,以确保所有“快照”打印出来。

注2 …停止按下button时,存储器保持与“短暂rest区”中所示的相同。 只要你认为它无限期地增长

记忆形象

——-更新———-

为了进一步确认问题,我创build了一个全新的项目,但没有任何内容,但Firebase导入,故事板中的button,下面的代码,并在我的6s(在模拟器上模拟似乎没有这个问题)模拟。 下面的图片certificate,这里有一些可怕的事情发生在我的记忆从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 }) } 

这可能只是因为您正在运行debugging版本。 我的结果,~128点击与debugging版本的设备后:

设备点击约128次后增加内存消耗。

正如你所看到的,绝大多数的内存消耗是由于debugging相关的性能工具造成的。 如果您想确认,可以通过编辑您的scheme来禁用此function:

编辑你的计划

然后禁用回溯logging:

禁用回溯记录。

在禁用的情况下,约128次点击几乎没有增长:

设备点击约128次后,内存消耗不会增加。

当然,你可能不想离开那个被禁用的程序,因为你可能会发现它可以用来诊断你的debugging版本中的崩溃和其他问题。 它不应该是一个发布版本的问题!

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

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

我认为这样也会对xcode有所帮助。 我已经在我的Android应用程序中完成。

 DatabaseReference ref = FirebaseDatabase.getInstance().getReference("BLAH_BLAH_STRING"); // Attach a listener to read the data at our posts reference ref.addListenerForSingleValueEvent(new ValueEventListener() { @Override public void onDataChange(DataSnapshot dataSnapshot) { // Do Some Stuff ref.removeEventListener(this); ref = null; } @Override public void onCancelled(DatabaseError databaseError) { } }); 

或者在iOS中,我想他们有不同的方法来使用。

removeAllObservers和removeObserverWithHandle:

请尝试使用上面给出的两种方法。