[英]Today Widget uses more memory each time it refreshes, then eventually crashes
我正在研究今日小工具,並遇到內存問題。
當我運行小部件並監視內存使用Xcode時,小部件在首次啟動時使用大約15MB。 然后, 當我從小部件屏幕向后滑動並返回時 ,它會上升到大約16MB。
每次我向后滑動並返回它時,內存使用量會增加大約0.5-1.5MB。 當我這樣做時,我得到內存警告( didReceiveMemoryWarning()
被調用),最終,隨着更多的刷卡,小部件崩潰。
所有這些症狀都發生在iPhone X上進行測試時。在模擬器上,小部件開始使用大約50兆字節,這看起來很奇怪,但它有相同的行為,每次我輕掃並刷回時內存使用量增加。
我試過用Instruments來分析它,但是我只能讓Instruments顯示開始時(當我第一次啟動Widget時)會發生什么,並且當我向后滑動時它不會繼續運行。
通過消除過程(評論我的小部件的實際功能),只有UI代碼仍然存在時,問題仍然存在。 這讓我覺得我的UI方法存在問題。
我過去曾構建過Today Widgets,但始終使用Interface Builder。 這次我決定以編程方式構建接口。 當我查看使用Interface Builder構建的其他Today Widgets時,我沒有看到每次刷新時增加內存使用量的相同行為。
首先,我將所有UI元素設置為私有惰性變量,如下所示:
private lazy var mainStackView: UIStackView = {
let stackView = UIStackView()
stackView.distribution = .fillEqually
stackView.translatesAutoresizingMaskIntoConstraints = false
return stackView
}()
然后,在viewDidLoad()
,我使用一些約束將我的視圖添加到TodayViewController
的視圖中,如下所示:
view.addSubview(mainStackView)
let stackViewLeadingConstraint = mainStackView.leadingAnchor.constraintEqualToSystemSpacingAfter(view.leadingAnchor, multiplier: 1)
let stackViewTopConstraint = mainStackView.topAnchor.constraintEqualToSystemSpacingBelow(view.topAnchor, multiplier: 1)
let stackViewTrailingConstraint = view.trailingAnchor.constraintEqualToSystemSpacingAfter(mainStackView.trailingAnchor, multiplier: 1)
let stackViewBottomConstraint = view.bottomAnchor.constraintEqualToSystemSpacingBelow(mainStackView.bottomAnchor, multiplier: 1)
view.addConstraints([stackViewLeadingConstraint, stackViewTopConstraint, stackViewTrailingConstraint, stackViewBottomConstraint])
由於我是以編程方式構建UI的新手, 有什么方法看起來顯然是不正確的,看起來它可能會導致內存泄漏?
我甚至嘗試將所有代碼注釋掉並使用基本的空白UIViewController
運行它,其中視圖生命周期功能甚至都沒有做任何事情,我仍然遇到內存泄漏。 這讓我覺得當我以編程方式構建我不做的界面時,我應該做些什么。
每當Today Widget出現時,似乎某些東西沒有被釋放並且在內存中被復制。 我很感激任何有關如何找到未發布內容的建議並強制系統發布它。 謝謝!
解決了
感謝Christopher Pickslay提供的故障排除提示,我能夠找到問題所在。 結果證明是我的錯。 為了解決以前不相關的問題,我打開了方案中的Zombie Objects,我仍然啟用了它。 一旦我把它關掉,這個問題就消失了。 這是我正在談論的設置:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.