這是我第一次從我的iOS應用程序中修復內存問題,所以我不確定如何跟蹤它,我一直在閱讀來自不同博客的帖子,我發現我的記憶在不斷增加:Xcode修復內存問題
問題是我不知道如何跟蹤和修復我的代碼中的問題,並且我也不知道什麼應該是最好的「增長」記憶。謝謝。
這是我第一次從我的iOS應用程序中修復內存問題,所以我不確定如何跟蹤它,我一直在閱讀來自不同博客的帖子,我發現我的記憶在不斷增加:Xcode修復內存問題
問題是我不知道如何跟蹤和修復我的代碼中的問題,並且我也不知道什麼應該是最好的「增長」記憶。謝謝。
首先,我建議你看WWDC 2013 Fixing Memory Problems和WWDC 2012 iOS App Performance: Memory視頻。它們是過時的,但仍然相關,展示了將上述屏幕快照下移到下一個級別,以確定內存問題的根本來源。
話雖如此,我有兩點意見:
以我的經驗,如今,這個問題很少被「泄露記憶」(即內存已經分配,對其中有沒有更多的參考資料,但你忽略了它)。在Swift中很難泄漏(如果你在Objective-C代碼中使用靜態分析器,那麼它也是如此)。
更常見的問題是由強引用週期導致的「廢棄內存」,重複計時器未被取消,視圖控制器場景之間的循環引用等。這些將不會被「泄漏」工具識別。只有通過挖掘分配工具。
首先,我經常喜歡看看什麼是廢棄內存的大部分原因。所以,我雙擊一個頂級調用樹,它會告訴我哪裏有被遺棄的分配內存:
注意,這並沒有告訴我爲什麼這個被廢棄,但通過了解體塊被遺棄的記憶被分配了,它給了我一些線索(在這個例子中,我開始懷疑SecondViewController
)。
然後我鑽入世代結果,並開始在分配中查找我的類(也可以通過手動選擇分配圖的相關部分,如discussed here)執行此操作。然後我篩選結果,在這裏搜索我的課程。當然,這不會永遠是最顯著的分配,但在我的經驗,這種被遺棄的記憶幾乎總是從我的課的一些濫用莖:
再次,這是指點我到SecondViewController
類。
注意,看着代的時候,我通常忽略第一一兩代人,因爲他們可能有誤報從應用程序而產生「熱身」。我專注於後幾代(並確保我只在應用恢復到某種穩定,靜止狀態時「標記」一代。
爲了完成,值得指出的是有時候有用的運行儀器與「記錄的引用計數」功能在未發行的分配:
如果你這樣做,你有時可以鑽入的保留和釋放通話清單,並確定誰仍具有很強的借鑑意義(專注於未配對的保留/釋放呼叫)在這種情況下,它不是非常有用,因爲它太多了,但我提到因爲有些輸入法這是非常有用的診斷誰仍然具有較強的參考:
如果您使用Xcode中8,它通過這在很大程度上削減,圖形表示的強引用了輝煌的對象圖調試器有問題的對象,例如:
由此看來,問題跳出我,我不僅有導航控制器保持這種視圖控制器的引用,但一個計時器。這恰好是一個重複的計時器,我忽略了它到invalidate
。在這種情況下,這就是爲什麼這個對象沒有被取消分配。
在沒有Xcode中8的對象圖形調試器,你留下來通過保留和釋放引用澆築(你可以看看每個那些強引用的,建立在那裏,並確定他們是否被正確釋放)或者只是通過我的代碼來查看可能保留特定視圖控制器的事情(強引用循環,重複計時器和循環視圖控制器引用是我看到的最常見的問題)。
我在跟蹤內存問題時遇到了一個問題,在獲得視圖控制器名稱的標記(例如您在屏幕截圖中顯示的標記)中,這意味着什麼?我得到的主要是類名和其他類型的依賴關係,只是爲了說明一點,我使用地圖框,顯然它在開發人員工具中不斷出現。 – reojased
尋找你的任何課程。如果你什麼都看不到,也要考慮緩存。正如該視頻所描述的,除了泄露的內存(無法再次訪問)和廢棄的內存(永遠不會再次訪問)之外,還有緩存的內存(不太可能在短時間內使用)。這就是爲什麼Allocations工具很有用,因爲您可以識別_what_正在被分配,而不是被釋放,並從那裏驅動您的分析(並專注於那些20 + mb代)。因此,確保所有緩存都對內存壓力做出響應,然後模擬內存警告並查看會發生什麼情況。 – Rob
好的,我會檢查一下,還有一件事,第一代超過40MB是一個問題?或者它只是應用程序「熱身」?@Rob – reojased
最小化您的應用程序的內存佔用
對於穩定性和性能的優勢,瞭解和傾聽的內存量不同可用跨各種設備上的應用支持你的應用程序是非常重要的。最大限度地減少應用程序的內存使用量是確保其全速運行並避免因客戶實例化中的內存耗盡而導致崩潰的最佳方法。此外,使用「分配工具」評估應用程序中的大內存分配有時可能是一個快速練習,可以產生令人驚訝的性能提升。
嘗試在你的應用程序運行泄漏儀器。如果你有什麼是真正的內存泄漏,它應該找到它。有一些設計會導致你的內存佔用量不斷增加。例如,如果您不斷調用segues來訪問每個新的視圖控制器而不關閉舊的視圖控制器,隨着視圖控制器堆棧的增長和增長,您將永久增加內存佔用。 –