簡體   English   中英

查看具有強引用的控制器導致內存泄漏

[英]View controller with strong references causing memory leaks

我的一個視圖控制器中存在強引用的問題導致內存泄漏。 首先,我的設置:

2個視圖控制器(v1和v2)。 v1轉向v2,v2有一個關閉按鈕,自動回彈到v1。 v2包含嘗試無限重新連接的代碼,直到建立連接。 (使用red5pro的視頻流)。 這是代碼:

func reconnect(){
        dispatch_after(dispatch_time(DISPATCH_TIME_NOW, Int64(5.0 * Double(NSEC_PER_SEC))), dispatch_get_main_queue()) { () -> Void in
            self.connectToStream()
        }
}

在我的情況下,連續重新連接是可取的,但是當用戶退出v2時,我希望重新連接停止。 但是目前,即使用戶離開v2,重新連接也會無限進行。

我已經知道這是因為v2具有強大的引用並且即使在用戶退出之后仍然繼續存在。 所以這導致無限調用reconnect()方法的代碼繼續運行。 我將嘗試清理v2以將所有內容轉換為弱引用,但我也在考慮一些替代方案,並且我有幾個問題:

  1. 有沒有辦法殺死viewDidDisappear上的重新連接,所以即使我的視圖控制器沒有被破壞,至少我的重新連接過程會停止?

  2. 從v2退回到v1后,如果用戶再次轉到v2,是否可以分配相同的v2實例,而不是每次都創建它的新實例?

dispatch_after無法取消,但有幾個選項:

  1. 使用弱引用,這將允許self取消分配:

     func reconnect() { dispatch_after(dispatch_time(DISPATCH_TIME_NOW, Int64(5.0 * Double(NSEC_PER_SEC))), dispatch_get_main_queue()) { [weak self] in self?.connectToStream() } } 

    這無疑使計時器繼續運行,但是阻止其保留視圖控制器,因此視圖控制器被釋放並且不會調用connectToStream

  2. 使用NSTimer並在視圖消失時取消它:

     weak var timer: NSTimer? func reconnect() { timer?.invalidate() timer = NSTimer.scheduledTimerWithTimeInterval(5.0, target: self, selector: #selector(handleTimer(_:)), userInfo: nil, repeats: false) } func handleTimer(timer: NSTimer) { self.connectToStream() } override func viewDidDisappear() { super.viewDidDisappear() timer?.invalidate() } 

    注意,因為這個基於selectorNSTimer保持對其target的強引用,所以你不能在deinit取消(因為有一個強大的參考周期)。 所以你必須找到一些其他適當的事件來解決這個問題(例如viewDidDisappear )。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM