簡體   English   中英

今天Widget每次刷新時都會占用更多內存,最終會崩潰

[英]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,我仍然啟用了它。 一旦我把它關掉,這個問題就消失了。 這是我正在談論的設置: Xcode中的Zombie Objects復選框

我沒有看到你如何構建UI的任何問題(從目前為止你所分享的內容)。 而不是儀器,嘗試使用內存圖調試器來查找您的泄漏。

內存圖調試器

它將暫停調試器,您可以使用頂部欄瀏覽所有的定位以及每個實例的指向。 打開內存圖調試器,查看圖形,然后取消暫停並將屏幕上的鏈接滾動幾次,然后再次打開內存圖調試器。 這應該可以讓你更好地了解什么是泄漏以及什么是持有它。

暫無
暫無

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

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