2017-07-25 21 views
13

我一直在尋找一個項目的Xcode內存圖工具,並注意到一些奇怪的行爲。希望有人能夠解釋發生了什麼/如果我需要擔心。Xcode調試內存圖顯示發佈的對象

我有一個視圖控制器,它創建了幾個對象(目前沒有太大的作用)當我關閉視圖控制器的時候,肯定會得到釋放。但是一個(有時是兩個)似乎掛在可視化調試器周圍:

enter image description here

只有兩個是不斷被創造,無一不是被deinitialized,在我的CONSOL證實:

enter image description here

我認爲我是正確的,我不對上述圖片中引用User對象的任何對象負責,那麼這是一個錯誤還是我不需要擔心的事情?

+0

仍然有這個問題? –

回答

0

是否從對象的deinit方法記錄了「釋放的用戶」?如果是這樣,這些對象被初始化,所以無論引用如何顯示,都無法保持對象的活着。鑑於此,我可能不會擔心,但如果您想確定,最好的辦法是啓動樂器,加載分配工具,選擇 - 單擊運行按鈕,然後選中「記錄引用計數「。這將允許您準確查看保留和釋放對象的內容。

1

如果您對所描述圖表中的任何對象(即保留用戶對象的對象)不負責,則不應該擔心。

僅供參考:在將Firebase加入應用程序之前,我遇到過泄漏。這不是你的錯,它不應該泄漏大量的記憶。

我同意@CharlesSrstka,如果您仍然擔心泄漏,您也可以在儀器上檢查它們,它會向您顯示可能導致問題的特定代碼行。

+0

將此添加到您的googleservice-info.plist中 FIREBASE_ANALYTICS_COLLECTION_ENABLED = NO 它可能會降低泄漏 –

0

我不確定這是不是你正在發生的事情,但這一切都發生在我身上,事實證明是Swift內部存儲器模型的後果,特別是它如何處理弱和無主的引用。

爲了適用於您,某些內容必須對您的用戶對象具有弱或無主的引用。如果這是這種情況,那麼當對象的最後一個強引用被移除時,該對象將被初始化 - 任何它所引用的對象的引用計數都會減少並在適當時被釋放,並且它的deinit()方法將會是運行(如日誌所示)。但是,它不會被解除分配。

是的,一個對象可以被deinitalized,但不會被釋放!其原因在於,指向此對象的弱或無主引用不得指向釋放(或更壞,重新分配)內存,因爲遵循此指針會產生「不安全」行爲。因此,這部分內存不能放棄,因此該對象不會被釋放。

然而兩件好消息。首先,只有那個特定的對象被泄露 - 而不是它引用的任何對象。這意味着只有一小部分內存被泄露。所以這可能不是什麼大問題。其次,對於弱引用,這種行爲在Swift 4中發生了變化(遺憾的是,無主引用仍然會有這種行爲)。在Xcode9測試版中試用您的項目並查看它是否仍然發生會很有趣。

這完全是從WWDC詢問同一類型的問題。希望它變得適用!

+0

感謝您的深刻回覆。在這種情況下,我不認爲有任何弱勢或無主的引用被舉行。我實際上創建了一個完全空白的項目,以便複製該行爲。項目中的所有內容都是基本上空的「User」類和「ViewController」。結束這些結果。 無論如何。 –

相關問題