[英]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以將所有內容轉換為弱引用,但我也在考慮一些替代方案,並且我有幾個問題:
有沒有辦法殺死viewDidDisappear上的重新連接,所以即使我的視圖控制器沒有被破壞,至少我的重新連接過程會停止?
從v2退回到v1后,如果用戶再次轉到v2,是否可以分配相同的v2實例,而不是每次都創建它的新實例?
dispatch_after
無法取消,但有幾個選項:
使用弱引用,這將允許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
。
使用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() }
注意,因為這個基於selector
的NSTimer
保持對其target
的強引用,所以你不能在deinit
取消(因為有一個強大的參考周期)。 所以你必須找到一些其他適當的事件來解決這個問題(例如viewDidDisappear
)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.